前文《解剖HttpClientFactory,自由擴展HttpMessageHandler》主要講如何爲HttpClientFactory自定義HttpMessageHandler組件, html
如今來完成課後的小做業: 將重點日誌字段顯示到Nlog的LayoutRenderer上。git
本文實現一個簡單流暢的LoggingHttpMessageHandler,記錄該HttpClient請求耗時,並顯示到 NLog LayoutRenderer。github
什麼是Layout Renderer?async
nlog日誌上輸出的特定字段,便於檢索和分類。ide
配置nlog顯示elapse Rendererui
# 截取自 nlog.config配置文件 <target name="bce-request" xsi:type="File" layout="${date:format=yy/MM/dd HH\:mm\:ss} [${level}].[${logger}].[${threadid}}].[${elapse}]${newline}${message} ${exception:format=tostring}"
fileName="${logDir}/bce-request.log" encoding="utf-8"/>
19/12/08 22:46:29 [Info].[System.Net.Http.HttpClient.bce-request.LogicalHandler].[6}].[415.2504] HTTP request http://localhost:5000/v1/eqid/e741e8d600151edc000000035decf3bf after 415.2504ms end -OK 19/12/08 22:47:15 [Info].[System.Net.Http.HttpClient.bce-request.LogicalHandler].[40}].[80.2951] HTTP request http://localhost:5000/v1/eqid/2a41e8d600151edc000000028decf3bf after 80.2951ms end -OK 19/12/08 22:48:06 [Info].[System.Net.Http.HttpClient.bce-request.LogicalHandler].[43}].[36.8624] HTTP request http://localhost:5000/v1/eqid/1a41e8d600151edc000000028decf3bf after 36.8624ms end -OK
nlog全部的日誌Render 都來自日誌寫入的信息, 所以咱們在寫入日誌時附帶該Renderer值, 而後配置nlog顯示日誌時提取該Renderer。spa
---------------------------------1-----------------------------pwa
寫入日誌時,爲Message傳入參數{Url}, {Elapse}, {StatusCode}:日誌
public class CustomHttpMessageHandler : DelegatingHandler { private readonly ILogger _logger; public AttachTraceIdScopeHttpMessageHandler(ILogger logger) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request == null) { throw new ArgumentNullException(nameof(request)); } var stopwatch = Stopwatch.StartNew(); var response = await base.SendAsync(request, cancellationToken); stopwatch.Stop(); _logger.Log(LogLevel.Information, new EventId(101, "Request End"), "HTTP request {Url} after {Elapse}ms end -{StatusCode}", request.RequestUri, stopwatch.Elapsed.TotalMilliseconds, response.StatusCode); return response; } }
--------------------------------2--------------------------------code
有簡單的lambda方式,這裏咱們採用稍微靈活的自定義類方式, 關鍵點是實現LayoutRenderer的抽象方法Append, 從LogEventInfo中提出Renderer值
[LayoutRenderer("elapse")] public class ElapseLayoutRenderer : LayoutRenderer { protected override void Append(StringBuilder builder, LogEventInfo logEvent) { builder.Append(logEvent.Properties["Elapse"].ToString()); } }
# 以上三個參數Url,Elapse,StatusCode都在LogEventInfo.Prpperties鍵值對中
--------------------------------3------------------------
按照文檔的要求,儘可能早點註冊自定義Nlog LayoutRenderer
public static void Main(string[] args) { LayoutRenderer.Register<ElapseLayoutRenderer>("elapse"); ...... }
關於將該HttpMessgaeHandler 應用到HttpClientFactory,請參閱 《解剖HttpClientFactory,自由擴展HttpMessageHandler》思路,
本文主要目的爲nlog 實現並添加自定義LayoutRenderer.
原文出處:https://www.cnblogs.com/JulianHuang/p/12000310.html