Asp.net-Core-Mvc
如何創建從 HttpContext.TraceIdentifier 讀取的 Serilog 豐富器?
我最近將 Serilog 集成到了幾個 .NET Standard 類庫中,包括一些 MVC 6 項目使用的類庫。我想做的是用 . 豐富日誌條目
HttpContext.TraceIdentifier。我編寫了一個設置HttpContext.TraceIdentifier為Correlation-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()。