【问题标题】:Serilog, ExceptionDetails and outputTemplateSerilog、ExceptionDetails 和 outputTemplate
【发布时间】:2020-04-10 12:08:48
【问题描述】:

我正在使用 .Net Core 3.1 和 Serilog,但我的日志输出有一个小而烦人的问题。

配置

我的appsettings.json

{
  "Serilog": {
    "Properties": {
      "Application": "Testing GZip"
    },
    "WriteTo": [
      {
        "Name": "Debug",
        "Args": {
          "outputTemplate": "[{Timestamp:o}] [{Level,3:u}] [{MachineName}/{ProcessName}:{ProcessId}/{ThreadName}:{ThreadId}] [{Application}/{SourceContext}] {Message}{NewLine}{Exception}{Properties:j}"
        }
      }
    ],
    "Enrich": [ "WithMachineName", "WithProcessName", "WithProcessId", "WithThreadName", "WithThreadId", "WithExceptionDetails" ]
  }
}

问题

如您所见,我的outputTemplate{NewLine}{Exception}{Properties:j} 结尾,如果您想记录异常和异常详细信息,这是强制性的。

不幸的是,我注意到输出的格式不正确。看看这里:

[2020-04-10T13:58:16.5592267+02:00] [INFORMATION] [PRO4-AEG/Test_Serilog_Logging:8096/:1] [Testing GZip/object] Start logging
{}[2020-04-10T13:58:16.6547724+02:00] [INFORMATION] [PRO4-AEG/Test_Serilog_Logging:8096/:1] [Testing GZip/object] Test1
{}Exception thrown: 'System.ArgumentNullException' in Test_Serilog_Logging.dll
{}[2020-04-10T13:58:16.6755158+02:00] [ERROR] [PRO4-AEG/Test_Serilog_Logging:8096/:1] [Testing GZip/object] You wrote 'THIS IS A TEST!' - Test_Serilog_Logging.TestClass
System.ArgumentNullException: Value cannot be null. (Parameter 'argument')
   at Test_Serilog_Logging.TestClass.TestLogging() in C:\Users\attil\source\repos\Test_Serilog_Logging\Test_Serilog_Logging\TestClass.cs:line 25
{"ExceptionDetail":{"Type":"System.ArgumentNullException","HResult":-2147467261,"Message":"Value cannot be null. (Parameter 'argument')","Source":"Test_Serilog_Logging","ParamName":"argument"}}[2020-04-10T13:58:16.7337262+02:00] [INFORMATION] [PRO4-AEG/Test_Serilog_Logging:8096/:1] [Testing GZip/object] Stop logging
{}The program '[8096] Test_Serilog_Logging.exe' has exited with code 0 (0x0).

正如您在第一个日志事件之后看到的那样,Serilog 开始在行前加上两个字符 {},如果我从配置文件中删除 {Properties:j},它就会消失。

有解决问题的办法吗?

谢谢。 阿提利奥

【问题讨论】:

    标签: c# serilog .net-core-3.1 serilog-exceptions


    【解决方案1】:

    每行开头的{} 是您的Properties 的内容为JSON(一个空对象),因为您没有为这些日志消息定义属性。由于您定义输出模板的方式,它出现在下一行的开头:

    {Message}{NewLine}{Exception}{Properties:j}
    

    这导致在异常详细信息和属性之前添加{NewLine}

    如果您将{NewLine} 添加到输出模板的末尾,您将在同一行获得{}...

    {Message}{Exception}{Properties:j}{NewLine}
    

    【讨论】:

      【解决方案2】:

      可能考虑的一个选项是使用 Serilog 格式化程序,例如 Serilog.Formatting.Json.JsonFormatterSerilog.Formatting.Compact.CompactJsonFormatter - 请参阅 Serilog wiki 了解有关 formatting output 的更多信息,以及下图关于如何配置这个你的 appsettings.json 文件。或者,您可以创建自己的自定义格式化程序 - 参见 CompactJsonFormatter 示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-29
        • 1970-01-01
        相关资源
        最近更新 更多