長い話を短く
前述の「解剖学的HttpClientFactory、無料HttpMessageHandlerを拡大するために、」主に拡張する方法について話をしたいHttpMessageHandlerは、例えば、ショーはすべてのHTTPリクエストでログインしTRACEID、
今、小さな放課後のジョブを完了しますTRACEIDはNlog LayoutRendererに表示されます。
滑らかでシンプルなLoggingHttpMessageHandlerを再実装、およびNLog LayoutRendererに加えます。
レイアウトレンダラは何ですか?
Nlog特定のフィールドは、検索や分類を容易にするため、ログに表示されます。
ブレーンストーミング
名前の定義レンダラー、定義から与えるeqidのカスタムレンダラ
#截取自nlog.config配置文件 <変数名= " フォーマット1 "値= " $ {日付:MM:\:フォーマットは= YY / MM / HH \ ddはSS}。[$ {レベル}] [$ {ロガー}] [$ {スレッドID}}]。[$ {ASPNET要求-URL:IncludeScheme = FALSE:IncludeHost = FALSE}]。[ $ {eqid} ] $ {改行} $ {メッセージ} $ {例外:形式=のtoString} " /> <ターゲット名= " BCE-要求" のxsi:タイプ = " ファイル" レイアウト = " $ {フォーマット1} " fileNameに = " $ {LOGDIR} /bce-request.log " エンコーディング = "UTF-8 " />
------------------------------- 1 ------------------ ----------
Nlog追加カスタムLayOutRenderer、 https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer
我々は少し柔軟なカスタムクラスの方法を取るラムダの簡単な方法は、あります。
[LayoutRenderer( "eqid" )]
publicクラスEqidLayoutRenderer:LayoutRenderer
{
保護オーバーライドボイド追加(のStringBuilderビルダー、LogEventInfo LOGEVENT)
{
builder.Append(logEvent.Properties [ "EventId_Name" ] .ToString())。 } }
キーポイントは、主要なパラメータLOGEVENT書き込みロギングによって形成された方法LayoutRenderer抽象追加し、達成することです。
EventId.Nameのステップ2からeqidレンダラ値の原因
--------------------------------- 2 ---------------- -------------
組み合わせることで、我々は、ログに書き込まれた時に財産のレンダラーの値に書き込まれます。
パブリック クラスAttachTraceIdScopeHttpMessageHandler:DelegatingHandler { プライベート 読み取り専用ILoggerです_logger。 公共AttachTraceIdScopeHttpMessageHandler(ILoggerですロガー) { _logger =ロガー?スロー 新しい例外ArgumentNullException(がNameOf(ロガーを)); } 保護 オーバーライド 非同期タスク<HttpResponseMessage> SendAsync(HttpRequestMessage要求、 CancellationToken cancellationToken) { 場合(要求== NULL ) { スロー 新規の例外ArgumentNullException(がNameOf(リクエスト))。 } VARストップウォッチ= Stopwatch.StartNew()。 VAR eventNameの= request.RequestUri.LocalPath.Split(' / ' ).LastOrDefault(); _logger.Log(LogLevel.Information、新規のEventId(100 、eventNameの)、 $ " スタート処理HTTPリクエスト{request.RequestUri} {request.Method} " )。 VaRの応答は、= のawait ベース.SendAsync(リクエスト、cancellationToken)を、 stopwatch.Stop(); _logger.Log(LogLevel.Information、新規のEventId(101 、eventNameの)、 $ " {stopwatch.Elapsed.TotalMilliseconds}ミリ秒後に終了処理をHTTPリクエスト- {response.StatusCode} " )。 戻り値の応答; } }
我々はより多くの事業を展開しているので、Nameプロパティは、[EventId_Name]プロパティのEventLogInfoのnlogで発見される最後のイベントID。
上述した方法は、CustomHttpMessageHandlerFilterに添加し、そしてIHttpMessageHandlerFilterが達成として登録されています。
------------------------------- - 3 - ---------------- -------
文書の要件に従って、できるだけ早くカスタムNlog LayoutRendererを登録するように、
登録名はTRACEID主な機能を開始し、あるときレンダラにサインアップ私はそう
パブリック 静的 ボイドメイン(文字列[]引数) { LayoutRenderer.Register < EqidLayoutRenderer >(" eqid " )。 ...... }
次のように最終的な出力は次のようになります。
19 / 12 / 07 00:35:42 [詳細] [System.Net.Http.HttpClient.bce-request.LogicalHandler] [。。19 }] [] [。。125aa91f0011426c000000045dea5ea0 ] スタートHTTP要求の処理のhttp:// localhostを:5000 / V1 / eqid / 125aa91f0011426c000000045dea5ea0 GET 19 / 12 / 07 00:35:44。。[詳細] [System.Net.Http.HttpClient.bce-request.LogicalHandler] [ 5 。。}] [] [ 125aa91f0011426c000000045dea5ea0 ] 後にHTTPリクエストを処理して終了2178.9971ms - OK
[OK]を、この記事の例を実行して、「見るために必ず解剖HttpClientFactory、無料HttpMessageHandlerを拡大する」アイデアを、この論文の主な目的は、カスタムNlog LayoutRendererを説明することです。