繁体   English   中英

特定于接收器的 Serilog 解构策略

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM