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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 03:15:06