11using System ;
22using System . Collections . Generic ;
33using System . Diagnostics . CodeAnalysis ;
4+ using System . Globalization ;
45using System . IO ;
56using System . Linq ;
67using System . Xml ;
@@ -89,9 +90,11 @@ public void Format(LogEvent logEvent, TextWriter output)
8990 /// <remarks>https://github.com/apache/logging-log4net/blob/rel/2.0.8/src/Layout/XmlLayout.cs#L218-L310</remarks>
9091 private void WriteEvent ( LogEvent logEvent , XmlWriter writer )
9192 {
93+ var useLog4JCompatibility = _options . Log4NetXmlNamespace ? . Name == "log4j" ;
9294 WriteStartElement ( writer , "event" ) ;
9395 WriteEventAttribute ( logEvent , writer , "logger" , Constants . SourceContextPropertyName ) ;
94- writer . WriteAttributeString ( "timestamp" , XmlConvert . ToString ( logEvent . Timestamp ) ) ;
96+ var timestamp = useLog4JCompatibility ? logEvent . Timestamp . ToUnixTimeMilliseconds ( ) . ToString ( CultureInfo . InvariantCulture ) : XmlConvert . ToString ( logEvent . Timestamp ) ;
97+ writer . WriteAttributeString ( "timestamp" , timestamp ) ;
9598 writer . WriteAttributeString ( "level" , LogLevel ( logEvent . Level ) ) ;
9699 WriteEventAttribute ( logEvent , writer , "thread" , ThreadIdPropertyName ) ;
97100 WriteDomainAndUserName ( logEvent , writer ) ;
@@ -102,7 +105,7 @@ private void WriteEvent(LogEvent logEvent, XmlWriter writer)
102105 WriteProperties ( logEvent , writer , properties , machineNameProperty ) ;
103106 }
104107 WriteMessage ( logEvent , writer ) ;
105- WriteException ( logEvent , writer ) ;
108+ WriteException ( logEvent , writer , useLog4JCompatibility ? "throwable" : "exception" ) ;
106109 writer . WriteEndElement ( ) ;
107110 }
108111
@@ -146,16 +149,17 @@ private void WriteEventAttribute(LogEvent logEvent, XmlWriter writer, string att
146149 }
147150
148151 /// <summary>
149- /// Convert Serilog <see cref="LogEventLevel"/> into log4net equivalent level.
152+ /// Convert Serilog <see cref="LogEventLevel"/> into log4net/log4j equivalent level.
150153 /// </summary>
151154 /// <param name="level">The serilog level.</param>
152- /// <returns>The equivalent log4net level.</returns>
155+ /// <returns>The equivalent log4net/log4j level.</returns>
153156 /// <remarks>https://github.com/apache/logging-log4net/blob/rel/2.0.8/src/Core/Level.cs#L509-L603</remarks>
157+ /// <remarks>https://github.com/apache/log4j/blob/v1_2_17/src/main/java/org/apache/log4j/Level.java#L48-L92</remarks>
154158 private static string LogLevel ( LogEventLevel level )
155159 {
156160 return level switch
157161 {
158- LogEventLevel . Verbose => "VERBOSE " ,
162+ LogEventLevel . Verbose => "TRACE " ,
159163 LogEventLevel . Debug => "DEBUG" ,
160164 LogEventLevel . Information => "INFO" ,
161165 LogEventLevel . Warning => "WARN" ,
@@ -331,9 +335,10 @@ private void WriteMessage(LogEvent logEvent, XmlWriter writer)
331335 /// </summary>
332336 /// <param name="logEvent">The log event.</param>
333337 /// <param name="writer">The XML writer.</param>
338+ /// <param name="elementName">The element name, should be either <c>exception</c> or <c>throwable</c>.</param>
334339 /// <remarks>https://github.com/apache/logging-log4net/blob/rel/2.0.8/src/Layout/XmlLayout.cs#L288-L295</remarks>
335340 [ SuppressMessage ( "Microsoft.Design" , "CA1031" , Justification = "Protecting from user-provided code which might throw anything" ) ]
336- private void WriteException ( LogEvent logEvent , XmlWriter writer )
341+ private void WriteException ( LogEvent logEvent , XmlWriter writer , string elementName )
337342 {
338343 var exception = logEvent . Exception ;
339344 if ( exception == null )
@@ -352,7 +357,7 @@ private void WriteException(LogEvent logEvent, XmlWriter writer)
352357 }
353358 if ( formattedException != null )
354359 {
355- WriteContent ( writer , "exception" , formattedException ) ;
360+ WriteContent ( writer , elementName , formattedException ) ;
356361 }
357362 }
358363
0 commit comments