Asp.net-Core-Mvc

如何創建從 HttpContext.TraceIdentifier 讀取的 Serilog 豐富器?

  • November 22, 2016

我最近將 Serilog 集成到了幾個 .NET Standard 類庫中,包括一些 MVC 6 項目使用的類庫。我想做的是用 . 豐富日誌條目HttpContext.TraceIdentifier。我編寫了一個設置HttpContext.TraceIdentifierCorrelation-ID請求標頭值的操作過濾器(如果存在):

public override void OnActionExecuting(ActionExecutingContext context)
{
   StringValues correlationIds;
   Guid correlationId;

   if (!context.HttpContext.Request.Headers.TryGetValue(Constants.CorrelationIdHeaderName, out correlationIds) || correlationIds.Count != 1 || !Guid.TryParse(correlationIds[0], out correlationId))
   {
       correlationId = _guidFactory.Random();

       context.HttpContext.Response.Headers.Add(Constants.CorrelationIdHeaderName, correlationId.ToString("D"));
   }

   context.HttpContext.TraceIdentifier = correlationId.ToString("D");

   base.OnActionExecuting(context);
}

問題是,我如何讓 Serilog 在此請求的整個生命週期中知道相關 ID?由於它看起來好像沒有HttpContext.Current屬性,所以我不確定如何創建一個可以工作的濃縮器。這甚至可能嗎?

我不認為你需要一個濃縮器。

{RequestId}放入水槽outputTemplate會給我一個像“0HL0GJPLR7AOD”這樣的ID 。如果我HttpContext.TraceIdentifier在記錄某些內容之前正確設置,那麼{RequestId}可以準確地為我提供該 ID,因此自定義 ID 也適用於{RequestId}.

我認為這{RequestId}是一個 Microsoft.Extensions.Logging 功能,但它可以與 serilog 一起使用(至少在您使用 Serilog.Extensions.Logging 時)。

更新:不要忘記配置Enrich.FromLogContext()

引用自:https://stackoverflow.com/questions/40184786