c# - 使用 Serilog 写入结构化日志

标签 c# .net serilog structured-logging

我尝试使用 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/

相关文章:

c# - Entity Framework : Can I Include() properties of subtypes?

c# - 如何对性能计数器类别进行版本控制?

c# - 使用 WPF 以编程方式更改语言/资源

.net - .NET 中的迭代器变量命名约定

.net - 2 监听同一端口的进程 - .NET 不抛出异常

c# - 将 Serilog ILogger 添加到静态类

c# - 如果 ModelState.IsValid 失败,会收到错误消息吗?

asp.net - 无法从浏览器访问IIS中发布的Asp.net网站

c# - 从 'System.String' 到 'Serilog.Core.IDestructuringPolicy' 的转换无效

c# - 使用 .NET core 3/3.1 的 Linux CentOS 8 中没有显示任何日志