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

部署Azure后Serilog日志级别设置失效问题求助

问题:Azure App Service中.NET6应用Serilog日志级别配置不生效

我们为部署在Azure App Service中的.NET 6 Web应用配置了Serilog,日志输出至Elasticsearch。本地环境下日志级别设置可正常生效,但部署到Azure后,日志级别配置被忽略,仍会输出Information和Debug级别的日志,未遵循已配置的最低日志级别。

现有代码与配置

Program.cs

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using System;
using System.IO;
using System.Threading.Tasks;

namespace MyApp
{
    public class Program
    {
        public async static Task<int> Main(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .AddEnvironmentVariables()
                .Build();

            Serilog.Debugging.SelfLog.Enable(message => Console.WriteLine(message));

            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration)
                .CreateLogger();

            try
            {
                Log.Information("Starting");
                await CreateHostBuilder(args).Build().RunAsync();
                return 0;
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, $"host terminated unexpectedly {ex}");
                return 1;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

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

AppSettings.json中的Serilog配置

"Serilog": {
    "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.Elasticsearch"],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
          "outputTemplate": "[{Timestamp} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
        }
      },
      {
        "Name": "Elasticsearch",
        "Args": {
          "nodeUris": "https://<<<ELASTICHOST>>>",
          "indexFormat": "logs-{0:yyyy.MM.dd}",
          "connectionGlobalHeaders": "Authorization=ApiKey <<<KEY>>>;",
          "emitEventFailure": "WriteToSelfLog",
          "autoRegisterTemplate": true,
          "registerTemplateFailure": "IndexAnyway",
          "autoRegisterTemplateVersion": "ESv7",
          "batchPostingLimit": 50,
          "batchAction": "Create",
          "period": 2,
          "inlineFields": true,
          "deadLetterIndexName": "deadletter-{0:yyyy.MM.dd}"
        }
      }
    ],
    "Enrich": ["FromLogContext"],
    "Properties": {
      "Application": "MyAzureAppServiceApp",
      "Environment": "Live"
    }
  }

Azure App Service应用程序设置

Serilog__MinimumLevel__Default = Warning
Serilog__MinimumLevel__Override__Microsoft = Warning
Serilog__MinimumLevel__Override__System = Warning

Azure应用程序设置截图

问题原因分析

当前代码中,你在Main方法中手动构建配置对象并初始化Serilog,但Host.CreateDefaultBuilder(args)会重新加载一套完整的配置源(包含命令行参数、环境变量、不同环境的appsettings文件等),两者的配置加载逻辑存在差异。此外,Azure App Service中Directory.GetCurrentDirectory()返回的路径可能并非网站根目录,导致自定义配置对象未正确加载环境变量或配置文件,最终Serilog未应用Azure上设置的日志级别。

解决方案

1. 让Host管理配置与Serilog初始化

修改Program.cs,删除手动构建配置的逻辑,改用Host.CreateDefaultBuilder提供的配置源初始化Serilog,确保Azure应用程序设置能被正确读取并覆盖本地配置:

using Microsoft.Extensions.Hosting;
using Serilog;
using System;
using System.Threading.Tasks;

namespace MyApp
{
    public class Program
    {
        public async static Task<int> Main(string[] args)
        {
            try
            {
                var host = Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    })
                    .UseSerilog((context, loggerConfig) =>
                    {
                        // 使用Host的配置源初始化Serilog
                        loggerConfig.ReadFrom.Configuration(context.Configuration)
                                   .Enrich.FromLogContext();
                        // 启用Serilog自日志,方便排查问题
                        Serilog.Debugging.SelfLog.Enable(message => Console.WriteLine(message));
                    })
                    .Build();

                Log.Information("Starting application");
                await host.RunAsync();
                return 0;
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Host terminated unexpectedly");
                return 1;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
    }
}

2. 验证Azure配置生效

  • 修改Azure应用程序设置后,必须重启App Service才能确保配置生效。
  • 通过Azure App Service的“日志流”查看Serilog自日志输出,确认环境变量是否被正确读取:如果配置加载正常,自日志会输出类似Configuration loaded from ...的信息;如果有错误,也会在日志流中显示。

3. 额外检查点

  • 确认Azure App Service的运行环境:如果存在appsettings.{Environment}.json(如appsettings.Production.json),需检查其中的Serilog配置是否与应用程序设置冲突,环境特定的配置文件优先级低于环境变量。
  • 验证应用程序设置的命名格式:确保使用双下划线(__)替代JSON路径中的冒号,例如Serilog__MinimumLevel__Default是正确的格式。

内容的提问来源于stack exchange,提问作者Stuart.Sklinar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:01:02