多项目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
相关产品推荐
相关产品推荐

