【问题标题】:Serilog destructure policy specific to a sinkSerilog 解构特定于接收器的策略
【发布时间】:2020-02-06 03:36:50
【问题描述】:

我很难让 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] 测试
┌────────────┬────────────────┐
│ TextColumn │ NumericColumn │
├────────────┼────────────────┤
│ Item0 │ 0 │
│ 项目 1 │ 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();

如何使这个配置生效?

请注意,此方案已根据我的需要进行了简化。

【问题讨论】:

    标签: logging serilog


    【解决方案1】:

    在提交到接收器之前,在写入线程上应用解构。

    要执行您正在执行的操作,您可以在给定接收器之前让 Enricher 调整属性。

    为避免继任者看到 Enricher 应用的突变,您可以:

    • 将浓缩器放在需要它的水槽之前,并让它成为最后一个水槽
    • 在第一个实例中使用浓缩物的接收器之后放置一个去除属性的浓缩器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2022-06-27
      相关资源
      最近更新 更多