项目迁移至.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
相关产品推荐
相关产品推荐

