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

问题描述 投票:0回答:2

我尝试了以下答案:

即这个:

 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在发生错误时被记录。

c# .net-core asp.net-core-webapi serilog error-logging
2个回答
2
投票

我发现的一个解决方法是从全局异常中间件手动记录错误。在 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
将包含必要的属性。


0
投票

您可以使用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 信息或更高级别的信息

© www.soinside.com 2019 - 2024. All rights reserved.