Azure Function应用程序中的Serilog表达式输出模板换行符

5vf7fwbs  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(152)

我刚刚将Serilog Expressions包添加到我的Azure函数应用程序中,这样我就可以使用该功能将SourceContext缩短为只有类名(顺便说一句,这很好用)。函数应用程序将其配置参数存储在Azure门户中的函数应用程序的设置-〉配置-〉应用程序设置部分。日志条目模板的设置名为SerilogSettings:OutputTemplate,为该设置输入的值与它在另一个应用程序中正确工作时完全相同:

{@t:yyyy-MM-dd HH:mm:ss.fff zzz}|{CorrelationId}|{@l:u3}|{Substring(SourceContext, LastIndexOf(SourceContext, '.') + 1)}|{@m}\n{@x}

我看到的问题是这里的换行符。Azure中的应用程序设置部分有一个“高级编辑”视图,在那里你可以看到输入的设置值实际上在后台被转换成一个大的json字符串,而这个json字符串实际上是应用程序在启动时读取的。下面是这个json字符串的一个关键部分:

[
  ...
  {
    "name": "SerilogSettings:OutputTemplate",
    "value": "{@t:yyyy-MM-dd HH:mm:ss.fff zzz}|{CorrelationId}|{@l:u3}|{Substring(SourceContext, LastIndexOf(SourceContext, '.') + 1)}|{@m}\\n{@x}",
    "slotSetting": false
  },
  ...
]

请注意,换行符\n已被转义,现在是\\n。因此,现在在启动时,该模板字符串被发送到Serilog,它无法理解\\n。最终结果是写入的日志条目中没有任何换行符。日志文件由一个非常长的行组成。在仍然使用表达式包的情况下,我有什么选择来解决这个问题?

pvabu6sv

pvabu6sv1#

在仍然使用Expressions包的情况下,我有哪些选项可以解决此问题?

  • 当使用Serilog时,模板中的消息属性应具有格式说明符1以实现所需格式:*
"{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:l}{NewLine}{Exception}"

有关表达式实现的更多详细信息,请参考此blog

相关问题