Serilog - 如何自定义格式化文件接收器的Destructured Class对象的输出

时间:2016-10-31 05:04:37

标签: logging serilog

我正在使用Serilog登录两个“接收器”。

  1. RollingTextFile
  2. SEQ
  3. 我想记录一个复杂的类型--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接收器。我也找不到任何其他示例实现。

1 个答案:

答案 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的成本只需支付一次。)