You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用ILogger<>无法触发NLog写入日志文件的问题

ILogger日志不生效?这里有几个关键排查点!

我看到你遇到的问题了:直接用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.csConfigureServices方法里有重新配置日志的代码(比如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

火山引擎 最新活动