ASP.NET Core WebAPI异常处理中间件捕获异常仍触发ExceptionHandlerMiddleware日志问题
问题结论
这个现象不代表异常处理中间件未正常工作,你配置的中间件已经成功捕获了异常并返回了预期的错误响应,日志输出是中间件的默认内置行为。
原因说明
ASP.NET Core 官方提供的ExceptionHandlerMiddleware在设计上,只要捕获到管道中未处理的异常,就会先以Error等级输出异常日志,再执行后续的异常处理逻辑(比如跳转到你配置的/error接口),这个日志输出和后续异常是否被正常处理没有关联。
修复方案
如果你不需要这条默认的ERROR日志,可以选择以下任意一种方案处理:
方案1:通过日志过滤规则屏蔽指定日志
你可以直接在日志配置中过滤掉Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware输出的Error等级日志,不会影响其他日志的正常输出:
方式A:修改appsettings.json日志配置
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware": "None" } } }
方式B:修改NLog配置增加过滤规则
在NLog的规则节点中增加以下配置,直接丢弃该类日志:
<logger name="Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware" minlevel="Error" maxlevel="Error" final="true" />
方案2:自定义异常处理逻辑替换默认实现
如果你想要完全控制异常的日志输出逻辑,可以使用UseExceptionHandler的重载方法自己实现异常处理流程,此时中间件不会再输出默认的ERROR日志:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger) { app.UseExceptionHandler(appBuilder => { appBuilder.Run(async context => { // 获取原始异常信息 var exceptionFeature = context.Features.Get<IExceptionHandlerPathFeature>(); var exception = exceptionFeature?.Error; // 自定义日志输出逻辑,比如改为Warning等级 if (exception != null) { logger.LogWarning(exception, "请求处理过程中发生异常:{Message}", exception.Message); } // 返回和之前一致的Problem响应 context.Response.StatusCode = StatusCodes.Status500InternalServerError; await context.Response.WriteAsJsonAsync(new ProblemDetails { Status = StatusCodes.Status500InternalServerError, Title = "服务器处理请求时发生错误" }); }); }); // 其余中间件配置... }
这种方式你可以灵活调整日志等级、输出内容,也可以自定义返回的错误响应格式。
内容的提问来源于stack exchange,提问作者Boris Makhlin
相关产品推荐
相关产品推荐

