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

多项目NLog实例日志输出异常问题排查

问题根源分析

嘿,我一眼就发现问题所在啦!你遇到的核心问题是NLog的LogManager.Configuration是全局静态属性——当你在Project2的CreateLogger方法里设置LogManager.Configuration = new XmlLoggingConfiguration(...)时,直接覆盖了整个应用程序的全局NLog配置。这就导致后续所有创建的Logger(包括Project1第二次调用的Logger)都会使用Project2的配置,所以Project1的"3"才会跑到Project2.log里去。

解决方案:隔离每个项目的NLog配置

要解决这个问题,你需要为每个项目创建独立的NLog配置和日志工厂,彻底避免修改全局的LogManager配置。下面是具体的修改方案:

修改你的Logger类

把原来依赖全局LogManager的代码,改成每个项目使用自己的LogFactory实例,让每个项目的配置完全隔离:

public static class Log
{
    // 用Lazy保存独立的LogFactory,每个项目的LogFactory对应专属配置
    private static readonly Lazy<LogFactory> _logFactory = new Lazy<LogFactory>(CreateLogFactory);
    private static readonly Lazy<Logger> _logger = new Lazy<Logger>(() => _logFactory.Value.GetCurrentClassLogger());

    private static LogFactory CreateLogFactory()
    {
        string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        string configPath = Path.Combine(assemblyFolder, "ProjectX.exe.nlog");
        
        // 创建独立的配置实例,绝不修改全局配置
        var config = new XmlLoggingConfiguration(configPath, true);
        // 返回绑定该配置的独立LogFactory
        return new LogFactory(config);
    }

    public static void Write(object log)
    {
        _logger.Value.Debug(log);
    }
}

为什么这样有效?

  • LogFactory是NLog专门用于隔离日志配置的核心类,每个LogFactory可以拥有完全独立的LoggingConfiguration,彼此之间不会互相干扰。
  • 原来的代码直接替换了全局日志配置,相当于把整个应用的日志规则改成了Project2的;现在每个项目的Log类都用自己的LogFactory,Project1和Project2的日志配置彻底分家。

验证效果

修改后再执行你的测试代码:

Project1.Log.Write("1"); 
Project2.Log.Write("2"); 
Project1.Log.Write("3"); 

此时Project1.log会包含"1"和"3",Project2.log只会包含"2",完全符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:49:17