![](/img/trans.png)
[英]Serilog Custom Sink Formatting Issue with Serilog LogEventPropertyValue
[英]Serilog destructure policy specific to a sink
我很难获得仅适用于特定接收器的 Serilog 解构策略。
我有两个接收器:1. 控制台 2. 文件
在记录 DataTable 时,我需要将该对象序列化到 (1) 控制台接收器的漂亮打印表中,而不是(2) 文件接收器。
例如,
var table = new DataTable("MyDataSet");
table.Columns.Add("TextColumn");
table.Columns.Add("NumericColumn", typeof(int));
table.Rows.Add("Item0", 0);
table.Rows.Add("Item1", 1);
logger.Information("Test {@Data}", table);
预期的输出应该是
[10:23:22 INF] Test ┌────────────┬───────────────┐ │ TextColumn │ NumericColumn │ ├────────────┼───────────────┤ │ Item0 │ 0 │ │ Item1 │ 1 │ └────────────┴───────────────┘
我有一个使用自定义IDestructuringPolicy
(名为ConsoleTablePolicy
)的解决方案来执行格式化,但它适用于所有接收器 - 而不仅仅是控制台接收器。
当前配置
有效,但适用于所有接收器 - 文件接收器也可以获得漂亮的打印表。 这不是我需要的。
var logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Console()
.WriteTo.File(@"C:\TEMP\log.txt")
.Destructure.With(new ConsoleTablePolicy())
.CreateLogger();
预期配置
将控制台接收器和自定义解构策略添加到子记录器时,永远不会调用解构策略。
var logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Logger(c => c.WriteTo.Console().Destructure.With(new ConsoleTablePolicy()))
.WriteTo.File(@"C:\TEMP\log.txt")
.CreateLogger();
如何使此配置工作?
请注意,此场景已根据我的需要进行了简化。
在写入线程提交到接收器之前,解构应用于写入线程。
为了做你正在做的事情,你可以在给定的接收器之前使用一个 Enricher 调整属性。
为了避免后继者看到 Enricher 应用的突变,您可以:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.