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

NLog.Extensions.Logging 5.2.0忽略Logging.LogLevel.Default配置的问题

.NET6控制台NLog升级NLog.Extensions.Logging 5.2.0后日志级别控制失效

我在为.NET 6控制台应用配置NLog时遇到问题:使用NLog.Extensions.Logging 1.7.5版本时,日志仅输出Information级别及以上内容,符合appsettings.json中Logging.LogLevel.Default的配置;但升级到5.2.0版本后,所有级别(包括Trace、Debug)的日志都会被输出。

相关配置与代码

appsettings.json配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning"
    }
  },
  "NLog": {
    "targets": {
      "console": {
        "type": "Console",
        "layout": "${longdate} ${pad:padding=5:inner=${uppercase:${level}}} ${message}${onexception:inner=${newline}${exception:format=ToString}}"
      }
    },
    "rules": [
      {
        "logger": "*",
        "writeTo": "console",
        "minLevel": "Trace"
      }
    ]
  }
}

启动代码

Host.CreateDefaultBuilder(args)
    .ConfigureLogging((context, logging) =>
    {
        var configuration = context.Configuration.GetSection("NLog");
        if (!configuration.Exists())
            return;

        LogManager.Configuration = new NLogLoggingConfiguration(configuration);
        logging.ClearProviders();
        logging.AddNLog();
    })
    .ConfigureServices(services =>
    {
        services.AddHostedService<MyHostedService>();
    })
    .Build()
    .Run();

MyHostedService代码

private readonly ILogger<MyHostedService> _logger;

public MyHostedService(ILogger<MyHostedService> logger)
{
    _logger = logger;
}

public Task StartAsync(CancellationToken cancellationToken)
{
    _logger.LogTrace("Test");
    _logger.LogDebug("Test");
    _logger.LogInformation("Test");
    _logger.LogWarning("Test");
    _logger.LogError("Test");
    _logger.LogCritical("Test");
    return Task.CompletedTask;
}

请问哪里配置错误?NLog.Extensions.Logging 5.2.0是否需要额外设置才能识别Logging.LogLevel.Default配置项?


问题原因

NLog.Extensions.Logging 5.x版本默认不再自动继承Microsoft.Extensions.Logging中Logging.LogLevel的过滤规则。你当前的NLog配置里规则的minLevel设为Trace,新版本不会自动叠加Logging.LogLevel.Default的限制,因此所有级别日志都会被输出。

解决方法

方法一:让NLog自动适配Microsoft日志过滤规则

修改启动代码,移除手动设置LogManager.Configuration的逻辑,改用AddNLog重载方法自动加载配置并应用Microsoft的日志级别过滤:

Host.CreateDefaultBuilder(args)
    .ConfigureLogging((context, logging) =>
    {
        logging.ClearProviders();
        // 自动读取NLog配置并应用Logging.LogLevel的过滤规则
        logging.AddNLog(context.Configuration);
    })
    .ConfigureServices(services =>
    {
        services.AddHostedService<MyHostedService>();
    })
    .Build()
    .Run();

方法二:直接在NLog配置中指定日志级别

如果想完全通过NLog自身配置控制,修改appsettings.json里的NLog规则,将minLevel设为Information:

"NLog": {
    "targets": {
        "console": {
            "type": "Console",
            "layout": "${longdate} ${pad:padding=5:inner=${uppercase:${level}}} ${message}${onexception:inner=${newline}${exception:format=ToString}}"
        }
    },
    "rules": [
        {
            "logger": "*",
            "writeTo": "console",
            "minLevel": "Information"
        }
    ]
}

方法三:保留手动配置NLog,手动添加过滤规则

如果必须保留手动设置LogManager.Configuration的逻辑,可在ConfigureLogging中手动添加对应过滤规则:

Host.CreateDefaultBuilder(args)
    .ConfigureLogging((context, logging) =>
    {
        var configuration = context.Configuration.GetSection("NLog");
        if (!configuration.Exists())
            return;

        LogManager.Configuration = new NLogLoggingConfiguration(configuration);
        logging.ClearProviders();
        logging.AddNLog();
        // 读取并应用Logging.LogLevel.Default的配置
        var defaultLogLevel = context.Configuration.GetValue<LogLevel>("Logging:LogLevel:Default", LogLevel.Information);
        logging.AddFilter("*", defaultLogLevel);
    })
    .ConfigureServices(services =>
    {
        services.AddHostedService<MyHostedService>();
    })
    .Build()
    .Run();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:25:31