将 log4net 属性序列化为 JSON 时的其他堆栈跟踪信息



我正在尝试将我的日志序列化为 Json。 我正在使用带有自定义布局的 log4net,但是当记录异常时,我得到以下格式错误的 JSON(请注意末尾的其他堆栈跟踪信息(

我是否缺少log4net的设置,或者这是一个序列化问题?

更新:这必须是log4net的东西,因为 json.net 完美地序列化异常。

更新

(已修复(:更新了下面的代码。

{
    "UserSessionId":"4b146c92-fe99-4f78-bbef-720df2cf7473",
    "ProcessSessionId":1,
    ...
    "Logger":"testharness.Program","ThreadName":"1",
    "ExceptionObject":{
        "ClassName":"System.ApplicationException",
        "Message":"Test Exception Logging",
        "Data":null,
        "InnerException":null,
        "HelpURL":null,
        "StackTraceString":"   at testharness.Program.Main(String[] args) in C:\temp\testharness\Program.cs:line 18",
        "RemoteStackTraceString":null,
        ...
        "WatsonBuckets":null
    },
    ...
        "log4net:HostName":"ol-4RBNMH2"
    }}
System.ApplicationException: Test Exception Logging
   at testharness.Program.Main(String[] args) in C:temptestharnessProgram.cs:line 18

log4net configuratiton

<log4net>
    <appender name="RollingFileCompositeAppender" type="log4net.Appender.RollingFileAppender">
      <file value="c:\logs\testharness.txt"/>
      <appendToFile value="true"/>
      <rollingStyle value="Composite"/>
      <datePattern value="yyyy-MM-dd"/>
      <maxSizeRollBackups value="-1"/>
      <maximumFileSize value="1MB"/>
      <countDirection value="1"/>
      <preserveLogFileNameExtension value="false"/>
      <staticLogFileName value="false"/>
      <layout type="Company.log4net.JsonLayout"></layout>
    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingFileCompositeAppender"/>
    </root>
  </log4net>

自定义布局类

    public class JsonLayout : LayoutSkeleton
    {
        public JsonLayout() {
            IgnoresException = false;
        }
...
        /// <inheritdoc />
        public override void ActivateOptions()
        {
        }
        /// <inheritdoc />
        public override void Format(TextWriter writer, LoggingEvent loggingEvent)
        {
            _customProperties.PhysicalMemory = Process.GetCurrentProcess().WorkingSet64;
            var evt = new CustomLoggingEvent(loggingEvent, _customProperties);
            writer.Write(JsonConvert.SerializeObject(evt));
        }
    }

    [JsonObject(MemberSerialization.OptIn)]
    public class CustomLoggingEvent
    {
 ... 
        [JsonProperty]
        public Exception ExceptionObject { get; set; }
        [JsonProperty]
        public long PhysicalMemory { get; set; }
        [JsonProperty]
        public PropertiesDictionary Properties { get; set; }
    }

测试工具:

   internal class Program
    {
        private static void Main()
        {
            Console.WriteLine($"{typeof(JsonLayout)}");
            var log = log4net.LogManager.GetLogger(typeof(Program));
            try
            {
                log.Debug("hello again world");
                throw new ApplicationException("Test Exception Logging");
            }
            catch (Exception e)
            {
                log.Error("Exception Thrown", e);
            }
            Console.ReadLine();
        }
    }

我下载了log4net源代码并发现了问题。 创建实现 LayoutSkeleton 的自定义布局时,如果布局处理 LoggingEvent.ExceptionObject,则 IgnoresException 属性应设置为 false;默认值为 true。我使用构造函数更新了问题中的代码,其中 IgnoresException 属性设置为 true。 我可能应该等一天研究,但也许这会帮助其他人。

最新更新