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

如何通过NLog JSON配置重写指定Logger的日志级别(无需修改代码)

问题场景

我有一个Asp.NET Core应用,使用的第三方库会输出INFO级别的日志:

_logger.LogInformation("About information...");

当前NLog的JSON配置如下:

{
  "NLog": {
    "targets": {
      "console": {
        "type": "Console",
        "layout": "${logger}|${date}|${level:uppercase=true}|${message}"
      }
    }
  }
}

日志输出示例:

ThirdPartyNamespace.Runner|2024/11/12 12:24:27.141|INFO|About information...

我希望不修改代码,仅通过配置将特定Logger(ThirdPartyNamespace.Runner)输出的INFO级别日志,在显示时转为DEBUG级别。但尝试的配置抛出异常:
Unhandled exception. NLog.NLogConfigurationException: 'ConditionBasedFilter' cannot assign unknown property 'level'='Debug'

尝试的错误配置:

{
  "rules": [
    {
      "logger": "ThirdPartyNamespace.Runner",
      "minLevel": "Debug",
      "writeTo": "Console",
      "filters": [
        {
          "type": "when",
          "condition": "level == LogLevel.Info",
          "action": "Log",
          "level": "Debug"
        }
      ]
    }
  ]
}
正确实现方式

之前的错误在于when过滤器不支持直接设置level属性,你需要使用NLog专门的级别修改机制,以下是两种可行方案:

方案一:修改实际日志级别(ChangeLevel过滤器)

使用ChangeLevel过滤器,匹配指定Logger的INFO日志并将其级别改为Debug:

{
  "NLog": {
    "targets": {
      "console": {
        "type": "Console",
        "layout": "${logger}|${date}|${level:uppercase=true}|${message}"
      }
    },
    "rules": [
      {
        "logger": "ThirdPartyNamespace.Runner",
        "minLevel": "Info",
        "writeTo": "console",
        "filters": [
          {
            "type": "ChangeLevel",
            "condition": "level == LogLevel.Info",
            "newLevel": "Debug"
          }
        ]
      },
      // 如果需要保留其他日志的默认规则,添加这条通用规则
      {
        "logger": "*",
        "minLevel": "Info",
        "writeTo": "console"
      }
    ]
  }
}

这个方案会真正修改日志对象的级别属性,对所有依赖日志级别的逻辑生效(比如其他过滤器、目标的级别限制)。

方案二:仅修改输出显示的级别文本

如果只是需要在控制台输出时显示为DEBUG,不改变实际日志级别,可以直接在Layout中通过条件判断替换显示内容:

{
  "NLog": {
    "targets": {
      "console": {
        "type": "Console",
        "layout": "${logger}|${date}|${when:when=level == LogLevel.Info and logger == 'ThirdPartyNamespace.Runner':inner=DEBUG:else=${level:uppercase=true}}|${message}"
      }
    },
    "rules": [
      {
        "logger": "*",
        "minLevel": "Info",
        "writeTo": "console"
      }
    ]
  }
}

这个方案只影响输出的文本内容,日志的实际级别仍为INFO,适合仅需调整显示效果的场景。


内容的提问来源于stack exchange,提问作者egeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:48:16