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();
}