.NET 6进程内Azure Function集成Serilog遇日志异常问题
.NET 6 Azure Functions 进程内模式配置 Serilog 实现单一控制台日志格式
问题场景
将.NET 7独立进程模式的Azure Function迁移至.NET 6进程内托管模式后,Serilog配置出现异常:
- 未开启
.WriteTo.Console时,仅输出Function宿主默认格式日志,自定义Serilog日志无输出 - 开启
.WriteTo.Console后,函数执行日志重复输出(一次宿主格式、一次Serilog自定义格式)
解决方案
1. 替换默认日志提供器,正确集成Serilog
修改Program.cs(或Startup.cs)中的日志配置,清除所有默认日志提供器后添加Serilog,确保日志系统完全由Serilog接管:
var configuration = builder.Configuration; // 初始化Serilog实例 Log.Logger = CreateLogger(configuration); // 配置日志服务 builder.Services.AddLogging(loggingBuilder => { // 清除所有默认的日志提供器(包括宿主自带的控制台日志) loggingBuilder.ClearProviders(); // 添加Serilog作为唯一日志提供器,dispose设为true确保程序退出时释放资源 loggingBuilder.AddSerilog(Log.Logger, dispose: true); });
2. 修改host.json禁用宿主控制台日志
在host.json中添加console.isEnabled: false,彻底关闭Azure Functions宿主的默认控制台日志输出:
"logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } }, "logLevel": { "MyApp.Emails.Functions": "Information", // 可选:降低宿主相关组件的日志级别,减少冗余输出 "Microsoft": "Warning", "Azure": "Warning" }, "console": { "isEnabled": false } }
3. 确保Serilog控制台输出配置正确
在CreateLogger方法中启用.WriteTo.Console,使用自定义输出模板:
public static Logger CreateLogger(IConfiguration configuration) { var logConfig = new LoggerConfiguration() .Enrich.FromLogContext() .Enrich.WithExceptionDetails() // Blob存储输出配置 .WriteTo.AzureBlobStorage( outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level}] [Customer:{CustomerId}] [Function:{Function}] [QueueItem:{QueueItem}] - {Message} {NewLine} {Exception}", connectionString: configuration.GetConnectionString("BlobStorageConnection"), storageContainerName: "email-function-logs", writeInBatches: true, period: TimeSpan.FromSeconds(10), retainedBlobCountLimit: 10000, blobSizeLimitBytes: 20 * 1024 * 1024, storageFileName: "log{yyyy}{MM}{dd}.txt") // 控制台输出配置 .WriteTo.Console( outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level}] [Customer:{CustomerId}] [Function:{Function}] [QueueItem:{QueueItem}] - {Message} {NewLine} {Exception}"); // Teams告警配置 var webhookUrl = configuration.GetConnectionString("TeamsNotificationWebhook"); if (!string.IsNullOrEmpty(webhookUrl)) { logConfig = logConfig.WriteTo.MicrosoftTeams(webhookUrl, restrictedToMinimumLevel: LogEventLevel.Error); } return logConfig.CreateLogger(); }
4. 确认依赖包版本
确保项目安装了以下必要的Serilog NuGet包:
Serilog.AspNetCoreSerilog.Sinks.ConsoleSerilog.Sinks.AzureBlobStorageSerilog.Enrichers.ExceptionDetailsSerilog.Extensions.Hosting
问题根源说明
- 原配置中仅通过
AddSingleton<ILoggerProvider>添加Serilog,未清除默认日志提供器,导致宿主控制台日志与Serilog日志同时输出,造成重复 - host.json未禁用
console.isEnabled时,Azure Functions宿主会持续输出自身格式的日志,无法被Serilog完全替代
内容的提问来源于stack exchange,提问作者Yehor Androsov
相关产品推荐
相关产品推荐

