使用NLog include特性时如何覆写日志规则?
解决NLog主配置过滤特定日志且避免重复写入的问题
问题分析
当前问题源于主配置新增规则与公共配置的全局规则叠加:你之前添加的规则主动指定了writeTo="file",导致该规则会写入一次文件,再加上公共配置中<logger name="*" minlevel="Debug" writeTo="file" />的全局规则,最终除目标过滤日志外,其他日志都被重复写入文件。同时你需要保留Console输出,且不能修改公共配置。
解决方案
在主配置中添加优先执行的过滤规则,通过IgnoreFinal阻止特定日志触发公共配置的文件写入规则,同时不额外写入目标,从根源消除重复。修改后的主配置如下:
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"> <variable name="ProductName" value="Process_X"/> <!-- 新增过滤规则,放在公共配置引入前优先执行 --> <rules> <!-- 匹配目标Logger的Debug日志,过滤指定消息 --> <logger name="*.Program" minlevel="Debug" maxlevel="Debug"> <filters defaultAction="Log"> <!-- 匹配指定消息时,终止后续规则对该日志的file目标处理 --> <when condition="starts-with('${message}', 'This is a debug message too')" action="IgnoreFinal" /> </filters> </logger> </rules> <include file="${currentdir}\NLogCommonConfig.xml" ignoreErrors="false" /> </nlog>
关键说明
- 规则执行顺序:主配置的
<rules>放在<include>之前,会优先于公共配置的规则执行,确保过滤逻辑先生效。 - IgnoreFinal的作用:当匹配到指定消息时,
IgnoreFinal会跳过该日志的后续规则处理——公共配置中写入file的全局规则会被忽略,但写入Console的规则不受影响,所有日志(包括被过滤的那条)依然会输出到控制台。 - 不设置writeTo:避免主动写入
file目标,彻底消除重复写入的问题。
原配置失败原因
- 你之前的规则设置了
writeTo="file",导致该规则主动写入一次文件,叠加公共配置的全局规则形成重复。 finalMinLevel="Debug"是针对日志级别终止后续规则,不适合你的特定消息过滤场景,改用过滤器的IgnoreFinal更精准。
内容的提问来源于stack exchange,提问作者josedvm
相关产品推荐
相关产品推荐

