Serilog - 在出错时从请求正文中记录特定属性

Serilog - logging specific properties from request body on error

我尝试了以下答案:

也就是这个:

 options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
   {
     // string body = your logic to get body from httpContext.Request.Body
        diagnosticContext.Set("Body", body);
   };

但在我的例子中,正文是一个空字符串。我从 httpContext 读取正文的代码基于此解决方案:

它在我为全局异常处理创建的自定义中间件中工作。但它不使用 Serilog。只是一些快速的穷人通过 Newtonsoft 序列化进行结构化日志记录的方法。

我在 nuget 上找到了这个 enricher:

但它似乎过时了,从那时起 Serilog 语法发生了变化。

我也查看了这个相关的官方Serilog ticket,已经关闭了。

Serilog 本身不支持从 http 请求添加自定义属性的工作流程吗?引自他们的 github 回购:

Thanks for raising this. I think copying and modifying https://github.com/serilog/serilog-aspnetcore/blob/dev/src/Serilog.AspNetCore/AspNetCore/RequestLoggingMiddleware.cs will be the simplest way forwards (I agree this is a bit unfortunate

例如,如果请求有一个名为 patientId 的字段,请记录该字段。因为有无数种方法可以从 http 上下文记录属性,所以要求开发人员提供该自定义方法是可以的。但是为此创建自定义中间件听起来有点矫枉过正。此外,多个中间件可能无法很好地协同工作。

有没有办法从 http 请求中记录自定义属性?我有自己的全局异常中间件,但不确定如何让它与 Serilog 一起工作。或者任何其他选项。主要要求 - 自定义属性应该 ONLY 被记录以防出错。

我发现的一种解决方法是手动记录来自我的全局异常中间件的错误。在 Program.cs 中,删除以下行:

app.UseSerilogRequestLogging();

然后在中间件中,添加

using Serilog;
// ... some code here, then in catch block
Log.Error("Unhandled exception occured when processing request {@errorRequest}.",
                                                                 errorRequest);
// ... more code, set 500 status and custom props on response

其中 errorRequest 将包含必要的属性。