不同记录器的 NLog 不同布局

NLog different layout for different loggers

为了在 NLog 中充分利用 MDLC 的优势,我试图在稍后通过日志调试时需要识别的所有对象的 init 方法中设置 MDLC 参数。

例如,有一个 A class 和一些 Foo() 方法,我有类似 logger.Debug('Foo method started') 的东西。有一些对象执行 Foo() 异步方法,所以我有一些用于此任务的 MDLC 参数,例如 MappedDiagnosticsLogicalContext.Set("A_Id", this.id);.

还有一个 B class 和一些 Bar() 方法记录 logger.Debug('Bar method started')。我再次需要识别 B 个对象,或者每次日志调用只需要一些相同的参数,所以我有 MappedDiagnosticsLogicalContext.Set("B_Id", this.id);.

并且 <Logger/> 中没有 Layout 属性。仅在 <Target/>。 因此,我看到了 3 种基于记录器 class:

包含此 MDLC 参数的方法
  1. 链接 when 结构:

    <variable name="optional" value="${aParams}${when:when=equals('${logger}','App.B'):inner=|${mdlc:item=B_id}}"/>
    
    <target layout="${optional}" 
    fileName="logs.txt"
    name="f"
    xsi:type="File"/>
    
  2. 拥有多个目标(每个记录器一个)并具有相同的文件名。不确定它是否真的合法,但我记得我在某处看到过。

    <target layout="${mdlc:item=A_id}"
        fileName="logs.txt"
        name="f"
        xsi:type="File"/>
    
    <target layout="${mdlc:item=B_id}"
        fileName="logs.txt"
        name="f"
        xsi:type="File"/>
    
  3. 共享 MDLC 参数,例如 A class 中的 MappedDiagnosticsLogicalContext.Set("Param", this.id);.B class 中的 MappedDiagnosticsLogicalContext.Set("Param", this.id);

    <target layout="${mdlc:item=Param}"
        fileName="logs.txt"
        name="f"
        xsi:type="File"/>
    

第三个看起来最容易实现,但如果这是更可取的方式,我看不出有任何理由使用字典并在任何地方只使用一个键。那么可能有一些更简单的方法来做到这一点或者哪个是首选?

选项 3 从性能角度来看是最快的,因为 NLog 可以在不检查条件的情况下打印。配置也更容易阅读。

不支持选项 2。

选项 1 可能更灵活,但速度有点慢。

注意:我不确定 MDLC 是这里的最佳选择。我认为事件属性也是一种选择。