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

