.NET 6中NLog AddNLog(IConfiguration)重载无效问题咨询
问题背景
环境:.NET 6;NLog.Web.AspNetCore v5.1.5(包含NLog.Extensions.Logging v5.1.0)
尝试从appsettings.json加载NLog配置,用以下代码时日志功能失效:
var config = builder.Configuration.GetSection("NLog"); builder.Logging.AddNLog(config);
换成下面的代码后日志正常工作:
var config = builder.Configuration.GetSection("NLog"); LogManager.Configuration = new NLogLoggingConfiguration(config); builder.Logging.AddNLog();
疑问:原本以为两种写法效果一致,想搞清楚接受IConfiguration的AddNLog重载到底是干什么用的?
解答
两个AddNLog重载的核心区别
接受IConfiguration的AddNLog重载
这个重载只负责把传入的配置绑定到NLog和ASP.NET Core集成的相关选项上(比如日志级别过滤规则、是否捕获特定日志源等),不会加载NLog的核心配置(比如日志输出目标Targets、路由规则Rules这些关键内容)。它管的是NLog和ASP.NET Core日志系统怎么配合,不是NLog本身该怎么输出日志。无参数的AddNLog重载
这个重载是直接用LogManager里已经存在的配置(也就是你手动通过LogManager.Configuration设置好的完整NLog配置),完成NLog和ASP.NET Core日志管道的绑定,让ASP.NET Core的日志请求能被NLog处理。
第一种写法失效的原因
你第一种写法里,调用AddNLog(config)只是配置了集成选项,但根本没给NLog加载核心的日志输出规则,相当于NLog知道要和ASP.NET Core配合,但不知道日志该输出到哪、怎么输出,自然就打不出日志。
而第二种写法先手动用NLogLoggingConfiguration把appsettings.json里的NLog核心配置加载到LogManager,再调用无参数的AddNLog()完成集成,这才是完整的正确流程。
接受IConfiguration的重载的正确用法
如果你的appsettings.json里既有NLog的核心配置,又有和ASP.NET Core集成的专属配置,可以这么用:
// 先加载NLog核心配置(Targets、Rules这些) LogManager.Configuration = new NLogLoggingConfiguration(builder.Configuration.GetSection("NLog")); // 再用IConfiguration配置集成选项(比如忽略特定日志类别) builder.Logging.AddNLog(builder.Configuration.GetSection("NLog:AspNetCore"));
这里假设你在"NLog"节点下加了"AspNetCore"子节点,专门用来配置NLog和ASP.NET Core集成的特殊规则。
内容的提问来源于stack exchange,提问作者Thorberg

