【发布时间】: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();
如何使这个配置生效?
请注意,此方案已根据我的需要进行了简化。
【问题讨论】: