You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至NLog v5.0.x后无日志输出问题求助

NLog 5.x升级后Net6.0 ASP.NET Core日志失效问题

问题背景

我们在ASP.NET、ASP.NET Core及命令行程序中使用NLog已有多年。在目标框架为net6.0的ASP.NET Core应用中,使用NLog 4.7.15及NLog.Extensions.Hosting 1.7.5时配置正常,但将两者升级至v5.0.x(如5.0.4)后,日志功能完全失效,日志文件始终为空。应用需使用appsettings.json中定义的Microsoft.Extensions.Logging过滤器。已查阅NLog 5.0重大变更文档并尝试兼容方案(包括在logger规则中添加filters元素并设置defaultAction="Log"),但仍无法解决问题。

目标环境

  • 目标框架:net6.0 ASP.NET Core应用
  • 升级前版本:NLog 4.7.15 + NLog.Extensions.Hosting 1.7.5(正常工作)
  • 升级后版本:NLog 5.0.4 + NLog.Extensions.Hosting 5.0.4(日志中断,无输出)

NLog.config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd http://nlog-project.org/schemas/NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off"
      internalLogFile="D:\Logs\StevenVolckaert.WebService\nlog-internal.log">

  <extensions>
    <add assembly="NLog.Extensions.Hosting" />
  </extensions>

  <variable name="ApplicationName" value="${configsetting:item=ApplicationName:default=application}" />
  <variable name="BuildNumber" value="${configsetting:item=BuildNumber:default=undefined}" />
  <variable name="EnvironmentName" value="${configsetting:item=EnvironmentName:default=undefined}" />
  <variable name="LogDirectory" value="${whenEmpty:whenEmpty=${basedir}logs:inner=${configsetting:item=NLog.LogDirectory}}" />

  <targets>
    <target
       xsi:type="Console"
       name="Console"
       layout="${longdate} ${threadid:padding=2} ${uppercase:${level:padding=5}} ${logger} ${message} ${exception:format=toString}">
    </target>
    <target
      xsi:type="File"
      name="LogFile"
      fileName="${var:LogDirectory}\${var:ApplicationName}.log"
      layout="${longdate} ${threadid:padding=2} ${uppercase:${level:padding=5}} ${logger} ${message} ${exception:format=toString}"
      archiveEvery="Day"
      archiveFileName="${var:LogDirectory}\Archive\{#}.${var:ApplicationName}.log"
      archiveNumbering="Date"
      archiveDateFormat="yyyy-MM-dd"
      maxArchiveDays="90">
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="Console,LogFile" />
  </rules>

</nlog>

appsettings.json

{
  "ApplicationName": "StevenVolckaert.WebService",
  "BuildNumber": null,
  "ConnectionStrings": {
    "DefaultDatabaseConnection": ""
  },
  "EnvironmentName": "Local",
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "NLog": {
    "LogDirectory": "D:\\Logs\\StevenVolckaert.WebService\\"
  }
}

Program.cs

using NLog.Extensions.Logging;

public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        builder.Services
            .AddLogging(loggingBuilder =>
            {
                loggingBuilder
                    .ClearProviders()
                    .SetMinimumLevel(LogLevel.Trace)
                    .AddConfiguration(builder.Configuration.GetSection("Logging"))
                    .AddNLog(builder.Configuration, new NLogProviderOptions { RemoveLoggerFactoryFilter = false });
            });

        // code removed for brevity

        var app = builder.Build();

        // code removed for brevity

        app.Run();
    }

尝试过的修改

在NLog.config的rules中添加filters:

<rules>
  <logger name="*" minlevel="Trace" writeTo="Console,LogFile">
    <filters defaultAction="Log" />
  </logger>
</rules>

解决步骤

1. 启用内部日志定位根因

先把NLog.config里的internalLogLevel从Off改成Debug,生成内部诊断日志,直接查看NLog初始化过程中的错误或警告:

<nlog ... internalLogLevel="Debug" internalLogFile="D:\Logs\StevenVolckaert.WebService\nlog-internal.log">

2. 修正Program.cs的NLog初始化逻辑

NLog 5.x适配了ASP.NET Core 6+的WebApplicationBuilder模式,建议替换为更贴合的扩展方法:

builder.Logging.ClearProviders();
builder.Logging.SetMinimumLevel(LogLevel.Trace);
builder.Logging.AddConfiguration(builder.Configuration.GetSection("Logging"));
// 使用UseNLog替代直接AddNLog,确保配置正确加载
builder.Host.UseNLog(new NLogProviderOptions { RemoveLoggerFactoryFilter = false });

3. 确保日志目录权限与自动创建

给File目标添加createDirs="true"属性,自动创建不存在的目录,同时检查应用程序对日志目录的读写权限:

<target
  xsi:type="File"
  name="LogFile"
  fileName="${var:LogDirectory}\${var:ApplicationName}.log"
  layout="${longdate} ${threadid:padding=2} ${uppercase:${level:padding=5}} ${logger} ${message} ${exception:format=toString}"
  archiveEvery="Day"
  archiveFileName="${var:LogDirectory}\Archive\{#}.${var:ApplicationName}.log"
  archiveNumbering="Date"
  archiveDateFormat="yyyy-MM-dd"
  maxArchiveDays="90"
  createDirs="true">
</target>

4. 验证过滤器组合逻辑

你设置了RemoveLoggerFactoryFilter = false,意味着NLog会同时应用自身规则和appsettings.json的Logging配置:

  • 临时将RemoveLoggerFactoryFilter改为true测试,如果日志正常输出,说明是过滤器组合冲突,再调整两者的级别匹配
  • 当前appsettings的Default: Debug和NLog规则的minlevel="Trace"是兼容的,不会导致过滤

5. 移除冗余的filters配置

NLog 5.x默认动作就是Log,你添加的<filters defaultAction="Log" />属于冗余配置,建议删除,回到原始rules配置。


内容的提问来源于stack exchange,提问作者Steven Volckaert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:35:22