使用 Serilog WriteTo.Console 时如何查看 MessageTemplate?

How can I see the MessageTemplate when using Serilog WriteTo.Console?

我正在使用 Serilog 进行日志记录,并使用控制台编写器将日志发送到标准输出,然后由 Filebeat 提取并发送到 Elastic。记录器的配置包括以下内容:

.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{Properties:j}{NewLine}{Exception}")

一切正常,结构化属性以 JSON 格式正确输出和呈现,但是,它缺少 MessageTemplate 属性 值,该值将输出类似于:

"MessageTemplate":"User {Username} logged in successfully"

这是一个问题,因为能够在 Kibana 中进行 运行 查询以通过搜索消息模板而不是呈现的消息来显示用户登录次数会很有用特定于单个用户,例如:

"Message":"User "Joe Bloggs" logged in successfully"

我可以看到我可以使用 JsonFormatter 对象写入控制台:

.WriteTo.Console(new JsonFormatter(renderMessage: true))

使用此方法会同时输出 Message 和 MessageTemplate 属性,但它会以 JSON 的丑陋 blob 形式输出,当人们在命令行上查看日志时,这真的很难阅读。

有人知道 Serilog 控制台输出模板是否可以包含 MessageTemplate 吗?

Serilog.Expressions可以做到。

dotnet add package Serilog.Expressions

然后:

  .WriteTo.Console(new ExpressionTemplate(
    "[{@t:HH:mm:ss} {@l:u3}] {@m} { {..@p, MessageTemplate: @mt} }\n{@x}"))