Azure Function v4中Serilog日志经Microsoft.Extensions.Logging转发的问题排查
Azure Function v4 替换Serilog配置问题解决
一、让所有日志直接由Serilog输出到控制台
当前配置存在两处核心问题:
- 同时调用
loggerBuilder.AddSerilog和.UseSerilog,导致日志路径冗余,部分日志仍通过Microsoft.Extensions.Logging转发 - 未禁用Azure Functions默认的控制台日志提供器,存在重复输出风险
解决方案
- 移除
ConfigureLogging中的loggerBuilder.AddSerilog调用,仅保留.UseSerilog作为Serilog的唯一集成入口 - 在
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日志系统的过滤逻辑
解决方案
- 在Serilog配置中显式设置
MinimumLevel,让Serilog独立控制日志输出级别,不受host.json默认规则影响 - 若需通过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
相关产品推荐
相关产品推荐

