protected override void FormatXml()

in src/log4net/Layout/XmlLayout.cs [192:291]


  protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
  {
    writer.EnsureNotNull().WriteStartElement(_eventElementName, Prefix, DefaultEventElementName, Prefix);
    writer.WriteAttributeString(LoggerAttributeName, loggingEvent.EnsureNotNull().LoggerName!);

    writer.WriteAttributeString(TimestampAttributeName, XmlConvert.ToString(loggingEvent.TimeStamp, XmlDateTimeSerializationMode.Local));

    if (loggingEvent.Level is not null)
    {
      writer.WriteAttributeString(LevelAttributeName, loggingEvent.Level.DisplayName);
    }

    writer.WriteAttributeString(ThreadAttributeName, loggingEvent.ThreadName!);

    if (loggingEvent.Domain is not null && loggingEvent.Domain.Length > 0)
    {
      writer.WriteAttributeString(DomainAttributeName, loggingEvent.Domain);
    }
    if (loggingEvent.Identity is not null && loggingEvent.Identity.Length > 0)
    {
      writer.WriteAttributeString(IdentityAttributeName, loggingEvent.Identity);
    }
    if (loggingEvent.UserName.Length > 0)
    {
      writer.WriteAttributeString(UsernameAttributeName, loggingEvent.UserName);
    }

    // Append the message text
    if (loggingEvent.RenderedMessage is not null)
    {
      writer.WriteStartElement(_messageElementName, Prefix, DefaultMessageElementName, Prefix);
      if (!Base64EncodeMessage)
      {
        Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, InvalidCharReplacement);
      }
      else
      {
        byte[] messageBytes = Encoding.UTF8.GetBytes(loggingEvent.RenderedMessage);
        string base64Message = Convert.ToBase64String(messageBytes, 0, messageBytes.Length);
        Transform.WriteEscapedXmlString(writer, base64Message, InvalidCharReplacement);
      }
      writer.WriteEndElement();
    }

    PropertiesDictionary properties = loggingEvent.GetProperties();

    // Append the properties text
    if (properties.Count > 0)
    {
      writer.WriteStartElement(_propertiesElementName, Prefix, DefaultPropertiesElementName, Prefix);
      foreach (KeyValuePair<string, object?> entry in properties)
      {
        writer.WriteStartElement(_dataElementName, Prefix, DefaultDataElementName, Prefix);
        writer.WriteAttributeString(NameAttributeName, Transform.MaskXmlInvalidCharacters(entry.Key, InvalidCharReplacement));

        // Use an ObjectRenderer to convert the object to a string
        if (loggingEvent.Repository is not null)
        {
          string valueStr;
          if (!Base64EncodeProperties)
          {
            valueStr = Transform.MaskXmlInvalidCharacters(loggingEvent.Repository.RendererMap.FindAndRender(entry.Value), InvalidCharReplacement);
          }
          else
          {
            byte[] propertyValueBytes = Encoding.UTF8.GetBytes(loggingEvent.Repository.RendererMap.FindAndRender(entry.Value));
            valueStr = Convert.ToBase64String(propertyValueBytes, 0, propertyValueBytes.Length);
          }
          writer.WriteAttributeString(ValueAttributeName, valueStr);
        }

        writer.WriteEndElement();
      }
      writer.WriteEndElement();
    }

    string? exceptionStr = loggingEvent.GetExceptionString();
    if (exceptionStr is not null && exceptionStr.Length > 0)
    {
      // Append the stack trace line
      writer.WriteStartElement(_exceptionElementName, Prefix, DefaultExceptionElementName, Prefix);
      Transform.WriteEscapedXmlString(writer, exceptionStr, InvalidCharReplacement);
      writer.WriteEndElement();
    }

    if (LocationInfo)
    {
      if (loggingEvent.LocationInformation is LocationInfo locationInfo)
      {
        writer.WriteStartElement(_locationElementName, Prefix, DefaultLocationElementName, Prefix);
        writer.WriteAttributeString(ClassAttributeName, locationInfo.ClassName!);
        writer.WriteAttributeString(MethodAttributeName, locationInfo.MethodName);
        writer.WriteAttributeString(FileAttributeName, locationInfo.FileName!);
        writer.WriteAttributeString(LineAttributeName, locationInfo.LineNumber);
        writer.WriteEndElement();
      }
    }

    writer.WriteEndElement();
  }