如何阻止ExceptionHandlerMiddleware异常写入Windows事件日志
我有一个使用Serilog将所有日志写入文件的ASP.NET Core 8 Web API,在program.cs中通过以下代码配置全局错误处理:
app.UseExceptionHandler(new ExceptionHandlerOptions() { AllowStatusCode404Response = true, ExceptionHandlingPath = "/error" });
我看到多篇文章提到,在appsettings中添加以下配置可阻止ExceptionHandlerMiddleware日志生成:
"Logging": { "LogLevel": { "Microsoft.AspNetCore": "None" } }
但每当抛出异常时,日志会同时写入Serilog文件和事件日志,事件日志内容如下:
Category: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware
EventId: 1
SpanId: 436cfbe67205ba87
TraceId: 74e004a439b069b40d366019bc429ac3
ParentId: 0000000000000000
ConnectionId: 0HN6V3VNU8A4U
RequestId: 0HN6V3VNU8A4U:00000001
RequestPath: /QAReleaseAhead/ProfileAn unhandled exception has occurred while executing the request.
请问我哪里配置出错了?
核心原因
你当前配置的"Microsoft.AspNetCore": "None"范围过于宽泛,且ASP.NET Core日志配置优先级、Serilog与默认日志提供程序的整合逻辑可能导致规则未生效。另外,事件日志的写入大概率来自ASP.NET Core默认日志提供程序,而非Serilog,你可能未禁用该提供程序的输出。
具体解决步骤
精准过滤ExceptionHandlerMiddleware日志
在appsettings.json中直接指定目标日志类别,替代宽泛的命名空间配置:"Logging": { "LogLevel": { "Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware": "None" } }精准配置能避免影响其他ASP.NET Core组件的日志输出,稳定性更强。
禁用默认日志提供程序,确保Serilog独占日志输出
在Program.cs配置Serilog时,通过writeToProviders: false阻止日志流向默认提供程序:var builder = WebApplication.CreateBuilder(args); // 配置Serilog并禁用默认日志提供程序 builder.Host.UseSerilog((context, configuration) => configuration.ReadFrom.Configuration(context.Configuration), writeToProviders: false); // 其他服务配置 builder.Services.AddControllers(); var app = builder.Build(); // 全局错误处理配置 app.UseExceptionHandler(new ExceptionHandlerOptions() { AllowStatusCode404Response = true, ExceptionHandlingPath = "/error" }); app.MapControllers(); app.Run();该设置会让所有日志仅通过Serilog输出到文件,彻底阻止默认提供程序写入事件日志。
检查环境配置冲突
若项目存在appsettings.Development.json等环境特定配置文件,需确认这些文件中未覆盖Logging节点的配置,避免主配置文件的规则被无效化。
内容的提问来源于stack exchange,提问作者Shane

