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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:04:56