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
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力