【小作業】為NLog自定義LayoutRenderer


長話短說

  前文《解剖HttpClientFactory,自由擴展HttpMessageHandler》主要講如何為HttpClientFactory自定義HttpMessageHandler組件,  

現在來完成課后的小作業: 將重點日志字段顯示到Nlog的LayoutRenderer上

本文實現一個簡單流暢的LoggingHttpMessageHandler,記錄該HttpClient請求耗時,並顯示到 NLog LayoutRenderer。

 什么是Layout Renderer?

 nlog日志上輸出的特定字段,便於檢索和分類。

配置nlog顯示elapse Renderer

# 截取自 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。

---------------------------------1-----------------------------

寫入日志時,為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--------------------------------

添加自定義LayOutRenderer

  有簡單的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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM