如何通过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应用配置中的设置
| Name | Value |
|---|---|
| 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
相关产品推荐
相关产品推荐

