DI环境下编程配置NLog失效:ILogger<T>无法正常输出日志
解决DI获取的ILogger不遵循NLog手动配置的问题
看起来你遇到的问题是两种日志获取方式的行为不一致:直接通过LogManager获取的日志器正常工作,但从DI容器拿到的ILogger<T>却不按预期输出日志。我来帮你排查并解决这个问题,主要有两个常见的原因和对应的解决方案:
1. Microsoft.Extensions.Logging 的级别过滤拦截了日志
默认情况下,Microsoft.Extensions.Logging 的日志过滤器会设置最小级别为 Information,也就是说,如果你用 ILogger<T> 输出 Debug 或 Trace 级别的日志,这些日志会被MS Logging的过滤器拦截,根本不会传递到NLog。而直接使用LogManager.GetLogger()的方式不受这个过滤机制影响,所以能正常输出所有级别。
解决方法:
在你的AddLogging配置中显式设置最小日志级别,确保所有需要的级别都能通过:
return new ServiceCollection() .AddLogging(builder => { builder.AddDebug(); // 关键:设置最小级别为Trace,确保所有级别日志都能传到NLog builder.SetMinimumLevel(LogLevel.Trace); builder.AddNLog(new NLogProviderOptions() { CaptureMessageTemplates = true, CaptureMessageProperties = true, }); }) // 其他依赖注册 .BuildServiceProvider();
2. AddNLog 加载了默认配置覆盖了你的手动配置
当你调用builder.AddNLog()时,如果项目中存在nlog.config文件,NLog会自动加载这个文件的配置,从而覆盖你之前手动设置的LogManager.Configuration。即使没有配置文件,也可能因为NLog Provider初始化时的逻辑,没有正确复用你预先设置的配置。
解决方法:
直接将你手动创建的LoggingConfiguration传递给AddNLog方法,确保NLog Provider直接使用你的自定义配置:
// 先创建并配置你的NLog配置 var config = new LoggingConfiguration(); var dirPath = Path.Combine(publicStorage, "Test"); var logFileTarget = new NLog.Targets.FileTarget() { CreateDirs = true, FileName = Path.Combine(dirPath, "test.log"), FileNameKind = NLog.Targets.FilePathKind.Absolute, Layout = "${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}", Name = "FileLog", }; config.AddTarget(logFileTarget); config.AddRuleForAllLevels(logFileTarget, "*", false); // 然后在DI配置中传入这个config return new ServiceCollection() .AddLogging(builder => { builder.AddDebug(); builder.SetMinimumLevel(LogLevel.Trace); // 直接传入手动配置的config,避免加载默认配置 builder.AddNLog(config, new NLogProviderOptions() { CaptureMessageTemplates = true, CaptureMessageProperties = true, }); }) // 其他依赖注册 .BuildServiceProvider();
验证步骤
修改完成后,你可以做以下测试:
- 使用
ILogger<T>输出不同级别的日志(如LogTrace、LogDebug、LogInformation) - 检查
Test目录下的test.log文件,确认所有日志都按预期格式输出 - 对比
LogManager.GetLogger()的输出,确保两者行为一致
内容的提问来源于stack exchange,提问作者Severin Jaeschke
相关产品推荐
相关产品推荐

