web-dev-qa-db-ja.com

Serilog:リクエストIDの実装

最近、ASP.NET Core 2 MVCアプリでNiceを再生するようにSerilogを構成しました。次のタスクは、システムのすべてのレイヤーでWebアプリへの着信要求を追跡することです。したがって、基本的には、いくつかのトークン(Serilogによって生成されたRequestIdなど)をアプリケーションの下位層に伝播する必要があります。

"Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.RollingFile" ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "log-{Hour}.txt",
          "fileSizeLimitBytes": "",
          "retainedFileCountLimit": "",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Application}] [{Level}] [{RequestId}] - {Message}{NewLine}{Exception}"
        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
    "Properties": {
      "Application": "MultilayerApp"
    }
},

ログには次のような素敵な入力があります

2018-01-19 14:06:01.165 +00:00 [App] [Warning] [0HLAV6PIMA9M0:00000001] - Accessing expired session, Key:"6e7f3ab5-db62-335d-1bc7-6824e5b918f5"

しかし、私の質問は、SerilogのどこにRequestIdエンリッチャーの実装があるのか​​ということです。正直なところ、私はそれを見つけることができません。

8
Macko

ASP.NET Coreでは、一部のロガーによって公開されるRequestIdは、TraceIdentifierの-​​ HttpContext の値です。このプロパティは、現在のリクエストを識別するためにアプリケーション全体で使用できます。

ただし、ロギングの目的で、HttpContextにフォールバックすることはできません。 Microsoft.Extensions.Logging抽象化サポート ロギングスコープ これは、そのスコープ内で適用されるロガーに追加情報を提供する方法です。

デフォルトでASP.NETCoreによって開かれる2つのログスコープがあります。それらの1つは HostingLogScope 開かれます すべてのリクエストの開始時に (少なくとも重要なロギングが有効になっている場合)。

ロガーは、 BeginScopeメソッド を実装することで情報にアクセスできます。これにより、各リクエストの開始時にHostingLogScopeオブジェクトが渡され、オブジェクトが見つかるまでオブジェクトを繰り返し処理します。プロパティ:

string requestId = null;
if (state is IEnumerable<KeyValuePair<string, object>> properties)
{
    foreach (var property in properties)
    {
        if (property.Key == "RequestId")
        {
            requestId = property.Value as string;
        }
    }
}

Serilog ほぼ同じです ただし、すべてのプロパティを格納します ログイベントに 。そのため、RequestIdへの明示的な参照は見つかりませんが、それを含めるようにログ文字列形式を指定すると、引き続き存在します。

15
poke