ASP.NET Core 6中Serilog日志重复问题求助
针对你遇到的ASP.NET Core 6 Blazor应用中Serilog日志重复(数据库重复行、Slack重复消息)的问题,可按以下步骤排查:
检查LoggerHelper的实现与调用逻辑
确认LoggerHelper静态类是否存在重复日志提交:比如是否在异常处理流程中,既通过中间件捕获异常并记录,又在业务代码中手动调用LoggerHelper记录同一条错误;或者LoggerHelper内部是否错误地多次调用Log.Error。建议优先使用DI注入的ILogger<T>而非直接操作Log.Logger静态实例,避免因静态实例重复初始化导致多实例日志记录。排查Serilog接收器的重复注册
虽然你确认appsettings无重复配置,但需检查扩展方法中是否多次添加了相同的接收器:比如是否在LoggerConfiguration中重复调用WriteTo.MSSqlServer或WriteTo.Slack;或者program.cs中是否既调用了自定义扩展方法,又单独注册了一次接收器。可临时简化扩展方法,只保留一个接收器测试,看重复是否消失。验证UseSerilogRequestLogging的影响
UseSerilogRequestLogging会自动记录请求生命周期的日志,若你在请求管道的其他位置(比如异常处理中间件)手动记录了相同的请求错误,就会导致重复。可临时注释掉UseSerilogRequestLogging,触发错误后观察日志是否还重复,以此判断是否是该组件导致的重复记录。检查Blazor异常处理的重复捕获
Blazor应用存在服务器端与组件端双重异常处理逻辑:比如program.cs中配置了app.UseExceptionHandler,同时Blazor组件中使用ErrorBoundary或手动捕获异常并记录日志,同一条错误可能被两端分别捕获并记录。需梳理异常处理流程,确保同一条错误只被记录一次。开启Serilog SelfLog定位内部问题
添加Serilog调试日志,查看内部是否存在重复写入的操作:Serilog.Debugging.SelfLog.Enable(Console.WriteLine);运行应用并触发错误,查看控制台输出,若SelfLog显示两次向同一接收器写入日志,即可确认是接收器重复注册或日志被重复提交。
检查是否存在多个Logger实例
确认是否在应用中初始化了多个Serilog Logger实例:比如LoggerHelper静态类自行创建了Logger实例,而program.cs中已通过builder.Host.UseSerilog()注册了全局Logger,导致两个实例同时记录日志。确保整个应用只使用一个全局Logger实例。
内容的提问来源于stack exchange,提问作者Mauro Alvarez

