如何通过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
相关产品推荐
相关产品推荐

