我尝试使用 Serilog 记录以下日志:
this.logger.Debug("Incoming metrics data {ClientId}", new { clientid = 54732 });
Serilog 产生以下输出:
Incoming metrics data "{ clientid = 54732 }"
Serilog 是一个结构化记录器,我希望它能生成如下内容:
Incoming metrics data {ClientId}, {clientId: 54732}
我做错了什么,还是我对 Serilog/结构化日志的理解错误?
最佳答案
有两件事;首先,要序列化这样的结构,您需要使用结构捕获运算符 @
:
this.logger.Debug("Incoming metrics data {@Client}", new { ClientId = 54732 });
这将捕获传入对象的各个属性,因此重写示例中的事件将具有 Client
属性和 ClientId
子属性。
这将为您提供如下输出:
Incoming metrics data {"ClientId": 54732}
(假设您使用带有默认模板的最新 Serilog 控制台接收器;其他配置可能无法以 JSON 样式打印嵌入数据。)
第二个考虑因素是事件的完整结构没有显示在 Serilog 的文本输出中 - 这是 Serilog 的“人类友好”面孔。如果您想记录结构,您可以像这样插入CompactJsonFormatter(再次假设控制台接收器):
.WriteTo.Console(new CompactJsonFormatter())
这也适用于文件等 - 详细信息参见 https://github.com/serilog/serilog-formatting-compact .
关于c# - 使用 Serilog 写入结构化日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48397796/