如何忽略className为Diagnostics的NLog日志?
解决NLog按className过滤忽略日志的问题
核心问题分析
你之前用${var:className}是错误的,因为${var}是用来引用NLog自定义变量的,而日志里的className是日志事件的自定义属性,需要用${event-properties}来读取。
正确的NLog配置方案
修改nlog.config中的日志规则,优先过滤掉className为Diagnostics的日志:
<rules> <!-- 过滤规则:匹配所有日志,忽略className为Diagnostics的条目,final=true表示后续规则不再处理 --> <logger name="*" writeTo="blackhole" final="true"> <filters> <when condition="'${event-properties:item=className}' == 'Diagnostics'" action="Ignore" /> </filters> </logger> <!-- 你的正常日志输出规则,比如写入文件 --> <logger name="*" minlevel="Warning" writeTo="yourFileTarget" /> </rules>
关键说明
${event-properties:item=className}:准确读取日志事件中携带的className属性,注意属性名的大小写要和日志里的完全一致(比如你的日志里是小写的className,就不要写成ClassName)。final="true":确保被过滤的日志不会进入后续的日志规则,彻底被忽略。writeTo="blackhole":NLog内置的"黑洞"目标,会丢弃所有写入的日志,不需要额外配置。
为什么之前的配置无效?
appsettings.json里的System.Diagnostics配置是按**日志类别(Logger Name)**过滤,而不是按自定义属性className过滤,所以对这类日志无效。${var:className}无法读取日志事件的自定义属性,只会读取你在NLog中用<variable name="className" value="xxx"/>定义的变量,自然匹配不到目标日志。
额外验证步骤
如果配置后还是没生效,可以先在日志目标的布局中显式输出className属性,确认它确实存在:
<target name="yourFileTarget" xsi:type="File" fileName="logs/${shortdate}.log"> <layout type="JsonLayout"> <attribute name="time" layout="${longdate}" /> <attribute name="message" layout="${message}" /> <attribute name="level" layout="${level}" /> <attribute name="className" layout="${event-properties:className}" /> <!-- 确认这里能输出正确的className值 --> </layout> </target>
内容的提问来源于stack exchange,提问作者TAD
相关产品推荐
相关产品推荐

