使用nlogsettings.json时NLog无法写入日志的问题排查
问题描述
尝试使用Microsoft.Extensions.Logging.ILogger搭配NLog作为日志提供程序,为精简配置并实现部署分离,创建了独立的nlosettings.json文件定义NLog配置。调试时_logger.LogInformation断点已触发,但日志未写入指定目录,修改配置也无效果。
现有配置与代码
nlosettings.json(注意文件名拼写)
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "NLog": { "internalLogFile": "c:\\Logs\\internal-nlog.txt", "LogLevel": { "Default": "Info", "Microsoft": "Warn", "Microsoft.Hosting.Lifetime": "Information" }, "extensions": [ { "assembly": "NLog.Extensions.Logging" }, { "assembly": "NLog.Web.AspNetCore" } ], "Targets": { "File": { "Type": "File", "FileName": "c:\\Logs\\service.log", "Layout": "${message}" } }, "Rules": [ { "Logger": "*", "MinLevel": "Debug", "WriteTo": "File" } ] } }
Program.cs
public class Program { public static void Main(string[] args) { var logger = LogManager.Setup().LoadConfigurationFromFile("nlogsettings.json").GetCurrentClassLogger(); logger.Info("Application starts"); CreateHostBuilder(args).Build().Run(); } private static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }).ConfigureLogging(logging => { logging.ClearProviders(); logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); }).UseNLog(); }
InventoryController.cs
public class InventoryController : ControllerBase { private readonly ILogger<InventoryController> _logger; public InventoryController(ILogger<InventoryController> logger, ILoggerFactory loggerFactory){_logger = logger;} [HttpGet] public async Task<ActionResult> GetInventory() { await Task.Delay(100); _logger.LogInformation("Testing the nlog log write"); return Ok("Success"); } }
问题排查与修复方案
1. 文件名拼写错误(致命问题)
配置文件实际命名为nlosettings.json(缺少字母g),但代码中加载的是nlogsettings.json,导致NLog无法读取配置。
- 修复:将配置文件重命名为
nlogsettings.json,保持与代码中的文件名一致。
2. 配置文件未复制到输出目录
如果配置文件没有被复制到程序运行的bin目录,NLog同样无法加载它。
- 修复:右键项目中的
nlogsettings.json→ 属性 → 设置“复制到输出目录”为如果较新则复制或始终复制。
3. NLog初始化冲突
在Main方法中手动通过LogManager.Setup()初始化了NLog,之后又通过UseNLog()让Host再次初始化,导致配置冲突。
- 修复:修改
Program.cs,统一通过Host加载NLog配置,移除手动初始化代码:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } private static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .ConfigureLogging(logging => { logging.ClearProviders(); logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); }) .UseNLog("nlogsettings.json"); // 指定NLog配置文件路径 }
4. 日志目录未自动创建
NLog默认不会自动创建日志目录,如果C:\Logs不存在,日志无法写入。
- 修复:手动创建
C:\Logs目录,或者在NLog配置的File Target中添加CreateDirs="true":
"Targets": { "File": { "Type": "File", "FileName": "c:\\Logs\\service.log", "Layout": "${message}", "CreateDirs": "true" } }
5. 检查NLog内部日志
配置中已开启内部日志internalLogFile,可以查看c:\Logs\internal-nlog.txt文件,里面会记录NLog加载配置和写入日志时的错误信息,帮助进一步排查问题。
内容的提问来源于stack exchange,提问作者alienavatar
相关产品推荐
相关产品推荐

