我正在使用Serilog登录两个“接收器”。
我想记录一个复杂的类型--FileInfo对象。
在Seq中,我想要完整的对象及其所有属性。
然而,在RollingTextFile中,我只想在文本文件中打印' fileInfo.FullName ',否则文本文件会很脏并且难以阅读。
我的日志记录如下;
logger.Information("Processing File: {@fileInfo} - Attempt ({intAttemptCounter}/3).",fileInfo, intAttemptCounter)
这可以正常工作,fileInfo对象被解构,但如上所述,会产生一个混乱且不可读的文本文件。
我想我需要使用此处概述的自定义“格式提供程序”; https://github.com/serilog/serilog/wiki/Formatting-Output#format-providers
但我无法弄清楚如何为fileInfo类对象实现它,并仅将其应用于RollingTextFile接收器。我也找不到任何其他示例实现。
答案 0 :(得分:2)
您可以在消息中包含名称(将显示在滚动文件中),而不是条件格式,并将完整信息作为属性附加(仅在Seq中显示)。
var withFileInfo = logger.ForContext("File", fileInfo, destructureObjects true);
withFileInfo.Information("Processing File: {FileName} - Attempt ({intAttemptCounter}/3).",
fileInfo.FullName, intAttemptCounter)
这样也可以在Seq中显示更好的内容,因为该消息只包含简单的文件名。
(另外,只需注意 - withFileInfo
记录器可以在循环的每次迭代中重复使用,因此序列化fileInfo
的成本只需支付一次。)