Nlog 5.0以上不在支持appsettings.json中日志级别过滤

2023-07-12  乐帮网

.net nlog

.Net 中使用Nlog做为日志模块,很简单又方便的就可以集成到一起,我们知道Nlog中的日志级别定义如下:

public enum LogLevel
    {
        Trace = 0,
        Debug = 1,
        Information = 2,
        Warning = 3,
        Error = 4,
        Critical = 5,
        None = 6
    }

在appsettings.json中设置过滤级别如下:

{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Warning"
    }
  }
}

但是自从Nlog升级到5.0后这个功能就失效了,复现如下:

1、在Nlog.config中我们设置一个输出到文本

<logger name="*" minlevel="Trace" writeTo="Application"/>

2、设置appsettings.json如下:

"Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  }

3、在主程序中启用nlog如下:

  IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureLogging(logging =>
    {
        logging.ClearProviders();
    })
    .UseNLog()

4、在程序中使用日志

private readonly ILogger<MyService> _logger;
_logger.LogInformation("Info");
        _logger.LogDebug("Debug");
        _logger.LogTrace("Trace");

最终发现使用nlog4.14.0时只有 Info 级别日志输出 - 这个是我们想要的也是正确的
使用Nlog 5.0.0 或者更高版本时 : info, debug 和 trace都输出了日志 - 这个和我们的预期不符合
难道是Nlog的使用方式改了吗?或者是它的一个Bug?

项目遇到的这个问题在网上也看到了一样的提问,到底怎么做呢?经过层层寻找--国内网站和搜索价值为零,最终还是找到答案,确实Nlog5.0开始这一部分功能有变化,跟随.net6开始有一个RemoveLoggerFactoryFilter 的概念,我们只需要设置它就可以了,如下:

builder.Services.AddLogging(loggingBuilder =>
{
    loggingBuilder.ClearProviders();
    loggingBuilder.AddNLog(new NLogProviderOptions { RemoveLoggerFactoryFilter = false });
});

解决问题真是一个需要细心和耐心的过程。

参考链接:
https://blog.elmah.io/nlog-tutorial-the-essential-guide-for-logging-from-csharp/
https://github.com/NLog/NLog.Extensions.Logging/issues/389
https://geekrepos.com/NLog/NLog.Web/issues/875
https://github.com/NLog/NLog.Web/issues/875

 

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力