【问题标题】:Serilog - logging specific properties from request body on errorSerilog - 从请求正文中记录错误的特定属性
【发布时间】:2022-02-02 01:35:39
【问题描述】:

我尝试了以下答案:

即这个:

 options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
   {
     // string body = your logic to get body from httpContext.Request.Body
        diagnosticContext.Set("Body", 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 一起工作。或任何其他选择。主要要求 - 应在出现错误时记录自定义属性。

【问题讨论】:

    标签: c# .net-core asp.net-core-webapi serilog error-logging


    【解决方案1】:

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

    【讨论】:

    • 由于缺乏更好的选择,我会在 2 天超时后接受这个作为答案。随时发布更多答案 - 如果更好,我将审查并接受更改。
    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多