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
将包含必要的属性。
我尝试了以下答案:
也就是这个:
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
将包含必要的属性。