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

项目迁移至.NET 5后Serilog向Azure EventHub写日志功能失效问题

问题排查与解决思路
  • 优先检查NuGet包版本兼容性
    你当前使用的Serilog.Sinks.AzureEventHub大概率是适配.NET Core 3.1的旧版本,旧版本依赖的Azure EventHub SDK与.NET 5的运行时存在兼容问题。请直接将Serilog.Sinks.AzureEventHub升级到最新稳定版,同时同步升级其依赖的Azure.Messaging.EventHubs相关包,避免版本冲突。
  • 清理重复的Serilog注册逻辑
    .NET 5对主机构建的日志注册逻辑做了调整,你当前的配置存在重复注册冲突:Program中已经调用了UseSerilog(),Startup的Configure方法中额外加的loggerFactory.AddSerilog()属于冗余配置,且在Startup.ConfigureServices中初始化Log.Logger的时机和UseSerilog()的初始化逻辑冲突,会导致日志实例被覆盖。
    推荐修改为统一在Program中完成Serilog配置,示例代码如下:
public static void Main(string[] args)
{
    // 提前加载配置初始化Serilog,避免启动阶段日志丢失
    var config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .Build();
    var eventHubConfig = config.GetSection("Logging").GetSection("eventHub");
    string eventHubConnection = eventHubConfig.GetValue<string>("connectionString").Replace(@"\", "");
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(config)
        .WriteTo.AzureEventHub(new JsonFormatter(),
            eventHubConnection,
            eventHubConfig.GetValue<string>("entityName"))
        .CreateLogger();
    try
    {
        CreateHostBuilder(args).Build().Run();
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "应用启动失败");
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog() // 这里已经完成注册,不需要再在Startup中加AddSerilog
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

同时删除Startup中所有Serilog相关的配置代码,包括ConfigureServices中的Log.Logger初始化、Configure中的loggerFactory.AddSerilog()调用。

  • 开启Serilog内部日志定位报错
    如果调整后还是失效,可以开启Serilog的SelfLog输出内部异常,定位具体报错原因,在初始化Log.Logger之前添加如下代码:
Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
// 或者输出到控制台/本地文件,方便查看
// Serilog.Debugging.SelfLog.Enable(Console.Error);

常见的内部报错包含连接字符串权限不足、EventHub实体名称错误、网络策略限制等,都可以通过SelfLog直接看到具体原因。

  • 检查日志级别过滤规则
    .NET 5默认的日志过滤优先级有调整,需要确认appsettings.json中没有配置过高的日志最低级别,或者配置的过滤规则把Serilog的输出屏蔽了,推荐在Serilog配置中明确指定最低日志级别,避免被全局配置覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:51:02