不同记录器的 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 参数的方法
链接 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"/>
拥有多个目标(每个记录器一个)并具有相同的文件名。不确定它是否真的合法,但我记得我在某处看到过。
<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"/>
共享 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 是这里的最佳选择。我认为事件属性也是一种选择。
为了在 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:
链接
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"/>
拥有多个目标(每个记录器一个)并具有相同的文件名。不确定它是否真的合法,但我记得我在某处看到过。
<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"/>
共享 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 是这里的最佳选择。我认为事件属性也是一种选择。