2016-10-21 42 views
4

私は最近、Serilogをいくつかの.NET Standardクラスライブラリに統合しました。これには、MVC 6プロジェクトで使用されるいくつかのクラスライブラリも含まれます。私がしたいのは、HttpContext.TraceIdentifierでログエントリを充実させることです。HttpContext.TraceIdentifierから読み込むSerilogエンリッチャを作成するにはどうすればいいですか?

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

問題相関IDのこの要求の人生のために、私はSerilogに認識させるか、どのようにある本があれば、私は、Correlation-IDリクエストヘッダの値にHttpContext.TraceIdentifierを設定アクションフィルタを書きましたか? HttpContext.Currentプロパティがあるかのように表示されないので、うまく機能するエンリッチャーを作成する方法がわかりません。これも可能ですか?

答えて

2

私はあなたがこれを強化する必要はないと思います。

シンクのoutputTemplate{RequestId}を入れると、「0HL0GJPLR7AOD」のようなIDが表示されます。もし私が何かを記録する直前にHttpContext.TraceIdentifierを設定すると、{RequestId}は私にそのIDを正確に与えるので、カスタムIDも{RequestId}で動作します。

私は{RequestId}がMicrosoft.Extensions.Logging機能だと思っていますが、少なくともSerilog.Extensions.Loggingを使用している場合は、そのままserilogで動作します。

更新Enrich.FromLogContext()を設定することを忘れないでください。

+0

私はこれを試してみます。ありがとう! – NathanAldenSr

+0

'JsonFormatter'を使ってどうすればいいですか?この場合、Serilogはオブジェクトを直列化するため、 'outputTemplate'パラメータはありません。 – NathanAldenSr

+0

@NathanAldenSr私は 'JsonFormatter'についてはわかりませんが、' CompactJsonFormatter'は 'RequestId"のようなJSONオブジェクトのプロパティとして 'RequestId'のようなイベントプロパティを自動的にインクルードします:" 0HL0NKROIGJ8O "' – user764754