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

Azure Function v4中Serilog日志经Microsoft.Extensions.Logging转发的问题排查

Azure Function v4 替换Serilog配置问题解决

一、让所有日志直接由Serilog输出到控制台

当前配置存在两处核心问题:

  • 同时调用loggerBuilder.AddSerilog和.UseSerilog,导致日志路径冗余,部分日志仍通过Microsoft.Extensions.Logging转发
  • 未禁用Azure Functions默认的控制台日志提供器,存在重复输出风险

解决方案

  1. 移除ConfigureLogging中的loggerBuilder.AddSerilog调用,仅保留.UseSerilog作为Serilog的唯一集成入口
  2. 在ConfigureFunctionsWorkerDefaults中清除所有默认日志提供器,让Serilog接管所有日志输出(包括框架日志)

修改后的Program.cs片段:

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(builder =>
    {
        // 清除默认日志提供器,确保所有日志走Serilog
        builder.ConfigureLogging(logging => logging.ClearProviders());
    })
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService(x => { x.EnableAdaptiveSampling = false; });
        services.ConfigureFunctionsApplicationInsights();
    })
    .UseSerilog((_, sp, loggerCfg) => loggerCfg
            .Enrich.FromLogContext()
            .WriteTo.Console()
            .WriteTo.ApplicationInsights(sp.GetRequiredService<TelemetryClient>(), TelemetryConverter.Traces))
    .Build();

host.Run();

二、host.json修改日志级别后Serilog日志不输出的问题

问题原因

  • host.json中的logLevel会控制Microsoft.Extensions.Logging的全局过滤规则,若Serilog通过Microsoft日志管道转发日志,会受该级别限制
  • 原配置未明确设置Serilog自身的日志级别,导致其输出完全依赖Microsoft日志系统的过滤逻辑

解决方案

  1. 在Serilog配置中显式设置MinimumLevel,让Serilog独立控制日志输出级别,不受host.json默认规则影响
  2. 若需通过host.json统一管理级别,可添加Serilog配置节点并让Serilog读取配置文件

方案1:代码中固定Serilog级别

修改UseSerilog配置,添加.MinimumLevel设置:

.UseSerilog((_, sp, loggerCfg) => loggerCfg
        .Enrich.FromLogContext()
        // 明确设置Serilog最低输出级别,不受host.json限制
        .MinimumLevel.Debug()
        .WriteTo.Console()
        .WriteTo.ApplicationInsights(sp.GetRequiredService<TelemetryClient>(), TelemetryConverter.Traces))

方案2:通过host.json控制Serilog级别

在host.json中添加Serilog配置节点:

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "default": "Information"
    },
    "Serilog": {
      "MinimumLevel": {
        "Default": "Debug"
      }
    }
  }
}

同时修改Program.cs让Serilog读取配置:

.UseSerilog((context, sp, loggerCfg) => loggerCfg
        .Enrich.FromLogContext()
        .ReadFrom.Configuration(context.Configuration)
        .WriteTo.Console()
        .WriteTo.ApplicationInsights(sp.GetRequiredService<TelemetryClient>(), TelemetryConverter.Traces))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:29