NLog中Info级日志输出带多余前缀的原因咨询
问题原因解析
这个前缀是**.NET原生System.Diagnostics.Trace组件**自动加上的,核心原因和你使用的TraceTarget直接相关:
TraceTarget的底层逻辑
NLog的TraceTarget并不自行处理日志输出,而是将日志转发给.NET内置的System.Diagnostics.Trace模块。该模块对不同级别日志的输出有内置规则:- Debug级日志会调用
Trace.WriteLine方法,默认不会添加任何额外前缀 - Info及以上级别(Information、Warning、Error、Fatal)会触发
Trace.TraceInformation、Trace.TraceError这类专属级别方法,这些方法会自动生成包含程序名、日志级别、事件ID的前缀,也就是你看到的「Testcenter.RoombusService.exe Information: 0 : 」格式。
- Debug级日志会调用
Debug级无前缀的原因
NLog的Debug级别对应System.Diagnostics.Trace的Verbose/Debug通道,走的是基础输出逻辑,不会触发带格式的前缀生成;而Info及以上级别匹配到了Trace模块的带格式输出方法,因此会带上前缀。额外说明
如果你同时启用了ConsoleTarget和TraceTarget,且Trace的默认监听器包含控制台(比如默认的ConsoleTraceListener),可能会出现日志重复输出:一条是ConsoleTarget的干净输出,一条是TraceTarget带前缀的输出。但你只在Info级看到前缀,说明Debug级的Trace输出要么未定向到控制台,要么被你忽略了。
快速解决思路(可选)
如果要去掉这个前缀,有几种可行方案:
- 移除
TraceTarget,仅使用ConsoleTarget输出(如果不需要Trace系统的其他监听器支持) - 给
TraceTarget自定义布局,覆盖默认输出格式,示例代码:var traceTarget = new TraceTarget(); // 自定义布局,可按需调整内容(示例包含级别、消息和异常) traceTarget.Layout = "${level:uppercase=true} ${message} ${exception:format=ToString}"; - 修改
System.Diagnostics.Trace的监听器配置,调整输出格式,但这会影响所有使用Trace的代码,不止NLog。
内容的提问来源于stack exchange,提问作者HackXIt
相关产品推荐
相关产品推荐

