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

.NET Core 5.0 WPF应用NLog配置双文件日志出现内容重复问题

问题根因

NLog的LoggingRule构造函数第一个参数是logger名称匹配模式,你最初的配置中两个规则的匹配模式都设为了*,代表所有名称的logger产生的日志都会同时命中这两个规则,自然会同时写入两个关联的文件中。

你后续修改后添加了Final=true理论上已经符合功能要求,如果仍然出现交叉写入的情况,大概率是配置未正确重新加载、有额外的其他名称日志输出命中了通配规则,或存在其他位置的配置代码覆盖了当前设置。


正确配置方案

按照「指定名称的logger仅写入对应独立文件」的需求,规则配置如下即可:

private void SetupLogger()
{
    var config = new LoggingConfiguration();

    // 定义两个文件输出目标
    var firstTarget = new FileTarget()
    {
        Name = "FirstLogger",
        FileName = Path.Combine(basePath, "log1.txt"),
        Layout = "${longdate} ${level} ${message}  ${exception}"
    };
    var secondTarget = new FileTarget()
    {
        Name = "SecondLogger",
        FileName = Path.Combine(basePath, "log2.txt"),
        Layout = "${longdate} ${level} ${message}"
    };
    config.AddTarget(firstTarget);
    config.AddTarget(secondTarget);

    // 规则1:仅匹配名称为FirstLogger的日志,写完终止后续匹配
    var ruleInfo1 = new LoggingRule("FirstLogger", NLog.LogLevel.Trace, firstTarget)
    {
        Final = true
    };
    // 规则2:仅匹配名称为SecondLogger的日志,写完终止后续匹配
    var ruleInfo2 = new LoggingRule("SecondLogger", NLog.LogLevel.Trace, secondTarget)
    {
        Final = true
    };

    // 可选规则:如果需要处理其他名称的日志,可以添加对应的通配规则,放在所有精确匹配规则之后即可
    // var defaultRule = new LoggingRule("*", NLog.LogLevel.Trace, otherTarget);

    config.LoggingRules.Add(ruleInfo1);
    config.LoggingRules.Add(ruleInfo2);
    // config.LoggingRules.Add(defaultRule);

    LogManager.Configuration = config;
}

注意规则添加顺序必须是精确匹配规则在前,通配规则在后,否则通配规则会先命中所有日志,导致后续精确规则失效。


验证方法

添加测试代码确认日志隔离效果:

// 只会写入log1.txt
var logger1 = LogManager.GetLogger("FirstLogger");
logger1.Info("FirstLogger专属日志");

// 只会写入log2.txt
var logger2 = LogManager.GetLogger("SecondLogger");
logger2.Info("SecondLogger专属日志");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:39:04