如何在NLog的File Logger中为所有日志自动记录自定义静态字段
实现方案
你要的效果完全可以实现,通过NLog自带的全局诊断上下文(GDC,Global Diagnostic Context)即可完成全局固定值的自动注入,不需要每次打印日志时手动编写属性赋值逻辑,具体操作步骤如下:
1. 程序启动时设置全局属性
在程序启动入口(例如Program.cs的Main方法、服务初始化逻辑)读取到MAC地址等固定标识后,仅需执行一次属性设置:
// 全局固定值仅需在启动时设置一次 NLog.GlobalDiagnosticsContext.Set("ComponentID", MACADDRESS);
2. 修改NLog配置引用全局属性
你可以直接在任意日志目标的布局中引用该全局属性,引用格式为${gdc:item=ComponentID}:
- 若为数据库日志目标,直接调整参数配置即可:
<parameter name="@ComponentID" layout="${gdc:item=ComponentID}"/>
- 若为文件日志目标,直接在输出布局模板中加入该占位符即可:
<target xsi:type="File" name="fileLogger" fileName="logs/app.log" layout="${longdate} | ${level} | ${message} | ComponentID:${gdc:item=ComponentID} | ${exception:format=ToString}" />
3. 正常打印日志即可
后续所有日志打印逻辑不需要做任何修改,直接使用常规写法即可,NLog会自动把全局设置的ComponentID值插入到所有日志的对应位置:
// 无需额外属性赋值 logger.Info("业务操作执行成功"); logger.Error(exception, "接口调用异常");
补充说明
如果你的场景需要线程维度的属性值,可以使用线程诊断上下文(TDC,ThreadDiagnosticsContext),引用格式为${tdc:item=属性名};如果需要异步上下文维度的属性值,可以使用逻辑映射诊断上下文(MDLC,MappedDiagnosticsLogicalContext),引用格式为${mdlc:item=属性名}。你当前需要全局固定值的场景,GDC是最适配的方案。
内容的提问来源于stack exchange,提问作者shelbypereira
相关产品推荐
相关产品推荐

