You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何忽略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>

关键说明

  1. ${event-properties:item=className}:准确读取日志事件中携带的className属性,注意属性名的大小写要和日志里的完全一致(比如你的日志里是小写的className,就不要写成ClassName)。
  2. final="true":确保被过滤的日志不会进入后续的日志规则,彻底被忽略。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:48:25