升级至NLog v5.0.x后无日志输出问题求助
问题背景
我们在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

