日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NLog自定义Layout Renderer

發布時間:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NLog自定义Layout Renderer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

更多精彩內容請關注我們

長話短說

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

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

本文自定義一個NLog Layout Renderer(顯示HttpClient請求的耗時)

什么是Layout Renderer?

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

# 截取自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},?這三個參數值可被提取作為 Renderer

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 Layout Renderer:

public static void Main(string[] args) {LayoutRenderer.Register<ElapseLayoutRenderer>("elapse");...... }

END

關于將該HttpMessgaeHandler應用到HttpClientFactory,請參閱《解剖HttpClientFactory,自由擴展HttpMessageHandler》思路。本文演示為nlog添加自定義LayoutRenderer。

+?https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer?

掃一掃左邊二維碼,
更多干貨等著你。
............

總結

以上是生活随笔為你收集整理的NLog自定义Layout Renderer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。