最近、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
エンリッチャーの実装があるのかということです。正直なところ、私はそれを見つけることができません。
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
への明示的な参照は見つかりませんが、それを含めるようにログ文字列形式を指定すると、引き続き存在します。