使用ILogger<>无法触发NLog写入日志文件的问题
我看到你遇到的问题了:直接用LogManager.GetLogger()能正常写日志,但依赖注入的ILogger<UserController>完全没反应。结合你的代码,我先给你指出最可能的根源,再列几个额外的排查步骤。
核心问题:Program.cs中的配置顺序错误
你的CreateWebHostBuilder里,调用顺序搞反了!先调用.UseNLog()再执行options.ClearProviders(),会把NLog刚注册的日志提供器也一起清除掉,导致ILogger<T>找不到可用的日志输出渠道,自然不会有日志产生。
修正后的代码:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureLogging(options => { options.ClearProviders(); // 先清除所有默认日志提供器 options.SetMinimumLevel(LogLevel.Trace); // 确保最低日志级别足够低,避免过滤掉Info级别的日志 }) .UseNLog() // 再添加NLog作为日志提供器 .UseStartup<Startup>();
这样调整顺序后,NLog的提供器会被保留,ILogger<T>就能正常输出日志了。
额外排查步骤(如果上面的修正还没解决问题)
确认NuGet包安装完整:
确保你已经安装了NLog.Web.AspNetCore这个包(ASP.NET Core环境下必须),并且版本和你的.NET Core版本匹配。不要只装基础的NLog包,Web环境需要专用的扩展包。检查NLog内部日志:
你的nlog.config已经开启了内部日志(internalLogFile="C:\temp\internal-nlog.log"),去这个文件里看看有没有错误信息,比如:- 配置文件加载失败
- 日志规则匹配问题
- 目标文件权限不足(比如写入
${basedir}\temp时没有权限)
检查Startup.cs是否覆盖了日志配置:
如果你的Startup.cs的ConfigureServices方法里有重新配置日志的代码(比如services.AddLogging(...)),可能会覆盖Program.cs里的设置,导致NLog没有被正确注册。确认日志级别设置:
确保你的ConfigureLogging里没有把最低级别设得比Info高(比如设成Warning),同时nlog.config里的规则minlevel="Info"要和你调用的日志方法级别匹配(你用的是LogInformation,对应Info级别,这点是对的)。确认nlog.config的复制属性:
在Visual Studio里右键nlog.config文件,检查"复制到输出目录"是否设置为"始终复制"或者"如果较新则复制",如果程序运行时找不到配置文件,也会导致ILogger<T>无法正常工作(不过你直接用LogManager.GetLogger能生效,这点大概率没问题,但还是确认下更稳妥)。
内容的提问来源于stack exchange,提问作者behzad chizari




