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

.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.AspNetCore
  • Serilog.Sinks.Console
  • Serilog.Sinks.AzureBlobStorage
  • Serilog.Enrichers.ExceptionDetails
  • Serilog.Extensions.Hosting

问题根源说明

  • 原配置中仅通过AddSingleton<ILoggerProvider>添加Serilog,未清除默认日志提供器,导致宿主控制台日志与Serilog日志同时输出,造成重复
  • host.json未禁用console.isEnabled时,Azure Functions宿主会持续输出自身格式的日志,无法被Serilog完全替代

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:35:42