使用Hellang ProblemDetails记录异常



我正在使用.Net Core 5的Web API应用程序中使用Hellang ProbemDetails包,在将响应发送回客户端之前,我需要记录异常。

我尝试将ExceptionHandler中间件和Hellang ProblemDetails中间件一起使用,但它们不能一起使用。使用Hellang ProblemDetails时,如何全局记录异常?

经过一番阅读,我意识到我不能同时使用ExceptionHandler中间件和Hellang ProblemDetails,因为两者都以自己的方式更改响应并相互影响。

根据这里的文档,您可以在更改响应之前使用ProbemDetails包的一个配置选项来执行代码,并且在那里您可以记录所需的所有信息。

services.AddProblemDetails(options =>
{
options.IncludeExceptionDetails = (context, ex) =>
{
var environment = context.RequestServices.GetRequiredService<IWebHostEnvironment>();
return environment.IsDevelopment();
};
options.Map<IdentityException>(exception => new ProblemDetails()
{
Title = exception.Title,
Detail = exception.Detail,
Status = StatusCodes.Status500InternalServerError,
Type = exception.Type,
Instance = exception.ToString()
});
options.OnBeforeWriteDetails = (ctx, pr) =>
{
//here you can do the logging
logger.LogError("Exception Occurred!!!!");
logger.LogError(pr.Detail);
logger.LogError(pr.Instance);
};
});

在这里,我使用一个带有额外字段的自定义异常,这些字段是响应中的问题详细信息对象所需的,并且我使用Instance字段来保存异常并在将响应返回给客户端之前记录我所需的所有信息。

另一个选项是配置options.ShouldLogUnhandledException以覆盖您的案例

https://github.com/khellang/Middleware/blob/5d5257ef54d82c902dbf087486365032d4804aac/src/ProblemDetails/ProblemDetailsMiddleware.cs#L119

示例:

options.ShouldLogUnhandledException = (_, ex, d) => d.Status is null or >= 500 || ex is ValidationException;

最新更新