我尝试了以下答案:
即这个:
options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
{
// string body = your logic to get body from httpContext.Request.Body
diagnosticContext.Set("Body", body);
};
但在我的例子中,主体是一个空字符串。我从 httpContext 读取正文的代码基于此解决方案:
它适用于我为全局异常处理创建的自定义中间件。但它不使用 Serilog。只是一些通过 Newtonsoft 序列化进行结构化日志记录的快速穷人方法。
我在 nuget 上找到了这个丰富器:
但它似乎已经过时了,Serilog 语法从那时起就发生了变化。
我还检查了这个相关的官方 Serilog 票证,该票证已关闭。
Serilog 本身不支持从 http 请求添加自定义属性的工作流程吗?引用自他们的 github 存储库:
感谢您提出这个问题。我认为复制和修改 https://github.com/serilog/serilog-aspnetcore/blob/dev/src/Serilog.AspNetCore/AspNetCore/RequestLoggingMiddleware.cs 将是最简单的前进方法(我同意这有点不幸
例如,如果请求有一个名为 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
将包含必要的属性。
您可以使用SerilogRequestLogging来记录请求/响应详细信息,如Serilog日志记录Web-api方法,在中间件中添加上下文属性
中所述要仅记录错误/警告,您可以指定参数
app.UseSerilogRequestLogging(
x =>
{
x.GetLevel = (context, _, ex) =>
context.Response.StatusCode >= StatusCodes.Status400BadRequest || ex != null
? LogEventLevel.Warning
: LogEventLevel.Debug;
x.EnrichDiagnosticContext = SerilogHelper.EnrichFromRequest;
x.IncludeQueryInRequestPath = true;
});
在生产中仅启用 logLevel 信息或更高级别的信息