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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:53:25