簡體   English   中英

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);
   };

但在我的例子中,body 是一個空字符串。 我從 httpContext 讀取正文的代碼基於此解決方案:

它適用於我為全局異常處理創建的自定義中間件。 但它不使用 Serilog。 只是一些快速窮人通過 Newtonsoft 序列化進行結構化日志記錄的方法。

我在 nuget 上找到了這個濃縮器:

但它似乎已經過時了,從那時起 Serilog 語法發生了變化。

我還查看了已關閉的相關官方 Serilog 票證。

Serilog 本身不支持從 http 請求添加自定義屬性的工作流程嗎? 從他們的 github repo 中引用:

感謝您提出這個問題。 我認為復制和修改https://github.com/serilog/serilog-aspnetcore/blob/dev/src/Serilog.AspNetCore/AspNetCore/RequestLoggingMiddleware.cs將是最簡單的方法(我同意這有點不幸

例如,如果一個請求有一個名為 PatientId 的字段,則記錄該字段。 因為有無數種方法可以從 http 上下文記錄屬性,所以可以要求開發人員提供該自定義方法。 但是為此創建一個自定義中間件聽起來有點矯枉過正。 此外,多個中間件可能無法很好地協同工作。

有沒有辦法從 http 請求中記錄自定義屬性? 我有自己的全局異常中間件,但不知道如何使它與 Serilog 一起工作。 或任何其他選擇。 主要要求 -應在出現錯誤時記錄自定義屬性。

我發現的一種解決方法是從我的全局異常中間件手動記錄錯誤。 在 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將包含必要的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM