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

如何通过Azure配置覆盖NLog日志规则?

Azure应用中通过应用配置覆盖NLog日志规则失败的解决方法

我有一个运行在Azure中的应用,日志写入数据库。原本通过appsettings.json配置NLog一切正常,但尝试通过Azure应用配置添加应用设置来覆盖NLog日志规则时失败了。

现有配置信息

appsettings.json中的NLog配置

"NLog": {
    "autoReload": true,
    "throwConfigExceptions": true,
    //"internalLogLevel": "Info",
    //"internalLogFile": "x:/internal-nlog.txt",
    "extensions": [
      { "assembly": "NLog.Extensions.Logging" },
      { "assembly": "NLog.Web.AspNetCore" },
      { "assembly": "NLog.Database" }
    ],
    "targets": {
      "async": true,
      "database": {
        "type": "Database",
        "dbProvider": "System.Data.SqlClient",
        "connectionString": "<Connection String>",
        "keepConnection": "true",
        "commandText": "insert into LoggingMessages(Created, MessageType, Message, CallSite, ExceptionDetail) values(getutcdate(), @level, @message, @callsite, @exception);",
        "parameters": [
          {
            "name": "@level",
            "layout": "${level}"
          },
          {
            "name": "@message",
            "layout": "${message}"
          },
          {
            "name": "@logger",
            "layout": "${logger}"
          },
          {
            "name": "@callsite",
            "layout": "${callsite}"
          },
          {
            "name": "@exception",
            "layout": "${exception:tostring}"
          }
        ]
      },
      "logconsole": {
        "type": "Console"
      }
    },
    "rules": [
      {
        "logger": "microsoft.*",
        "maxLevel": "Debug",
        "final": true
      },
      {
        "logger": "*",
        "minLevel": "Trace",
        "writeTo": "database"
      }
    ]
  }

Startup.cs中的配置代码

var logger = LogManager.Setup()
    .LoadConfigurationFromAppSettings()
    .GetCurrentClassLogger();

Program.cs中的CreateHostBuilder方法

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
           webBuilder.UseStartup<Startup>();
        })
        .UseNLog();

Azure应用配置中的设置

NameValue
NLog:rules[{"logger": "microsoft.","maxLevel": "Debug","final": true},{"logger": "","minLevel": "Warning","writeTo": "database"}]

问题原因与解决步骤

核心问题

  • LoadConfigurationFromAppSettings() 默认仅读取本地appsettings.json,不会自动加载Azure应用配置中的值。
  • 在Startup中直接调用该方法时,Azure应用配置的设置尚未合并到系统配置中,导致NLog无法读取到覆盖规则。

解决步骤

1. 修改NLog配置加载方式,使用已合并的IConfiguration

在Startup.cs中注入IConfiguration,让NLog从包含Azure应用配置的全局配置实例加载规则:

public class Startup
{
    private readonly IConfiguration _configuration;
    private readonly ILogger _logger;

    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;

        // 从全局配置加载NLog规则(包含Azure应用配置的值)
        _logger = LogManager.Setup()
            .LoadConfigurationFromConfiguration(_configuration)
            .GetCurrentClassLogger();
    }

    // 其他Startup代码...
}

2. 确保Azure应用配置被合并到系统配置

如果使用Azure App Configuration服务,需要在Program.cs中手动添加配置源(需安装Azure.Extensions.AspNetCore.Configuration.Secrets NuGet包):

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {
            var builtConfig = config.Build();
            var appConfigConnStr = builtConfig["AzureAppConfigurationConnectionString"];
            if (!string.IsNullOrEmpty(appConfigConnStr))
            {
                config.AddAzureAppConfiguration(appConfigConnStr);
            }
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .UseNLog();

3. 验证Azure配置的JSON格式

确保NLog:rules的JSON格式完全正确,使用双引号且数组结构无语法错误,示例值如下:

[{"logger": "microsoft.*","maxLevel": "Debug","final": true},{"logger": "*","minLevel": "Warning","writeTo": "database"}]

4. 开启NLog内部日志排查(可选)

在appsettings.json中开启内部日志,查看配置加载过程中的错误:

"internalLogLevel": "Info",
"internalLogFile": "d:/home/logfiles/internal-nlog.txt" // Azure App Service可用路径

内容的提问来源于stack exchange,提问作者Andrew Bailie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:40:20