NLog自定义Layout Renderer

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文自定义一个NLog Layout Renderer(显示HttpClient请求的耗时)


长话短说


前文《解剖HttpClientFactory,自由扩展HttpMessageHandler》主要讲如何为HttpClientFactory自定义HttpMessageHandler组件


本文自定义一个NLog Layout Renderer(显示HttpClient请求的耗时


什么是Layout Renderer?

nlog日志上输出的特定字段,便于检索和分类。


# 截取自nlog.config配置文件


       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键值对提取

      f8efff1e3fe3d0a74304c11aba326ebe.jpg


      3


      按照文档的要求,尽注册自定义Nlog Layout Renderer:


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


        END


        关于将该HttpMessgaeHandler应用到HttpClientFactory,请参阅《解剖HttpClientFactory,自由扩展HttpMessageHandler》思路。本文演示nlog添加自定义LayoutRenderer。

        相关实践学习
        日志服务之使用Nginx模式采集日志
        本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
        相关文章
        |
        5月前
        |
        Android开发 UED
        Android Item平移动画
        【6月更文挑战第18天】
        109 8
        |
        5月前
        |
        XML Java Android开发
        Android RecyclerView用代码动态设置item的selector
        Android RecyclerView用代码动态设置item的selector
        43 0
        |
        6月前
        |
        Android开发
        Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
        Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
        136 0
        |
        存储 缓存 索引
        RecyclerView 动画原理 | pre-layout,post-layout 与 scrap 缓存的关系
        RecyclerView 动画原理 | pre-layout,post-layout 与 scrap 缓存的关系
        86 0
        Core Animation - 摇动+循环动态画圆
        Core Animation - 摇动+循环动态画圆
        86 0
        Core Animation - 摇动+循环动态画圆
        |
        缓存 前端开发
        【绘制 widget】Flutter CustomPaint
        【绘制 widget】Flutter CustomPaint
        129 0
        【绘制 widget】Flutter CustomPaint
        |
        XML Java Android开发
        Android旋转动画rotate动画,xml配置set实现
        Android旋转动画rotate动画,xml配置set实现 作为快速备忘查询,写到这里记下。 在xml配置动画所需的set设置资源,然后上层Java代码以最少的代码实现一个匀速旋转的动画,这种开发场景在一些加载动画中比较常见,比如视频缓冲时候的加载动画。
        2107 0
        【错误记录】Flutter 使用 MediaQuery 适配全面屏报错 ( No MediaQuery widget ancestor found. )
        【错误记录】Flutter 使用 MediaQuery 适配全面屏报错 ( No MediaQuery widget ancestor found. )
        865 0
        【错误记录】Flutter 使用 MediaQuery 适配全面屏报错 ( No MediaQuery widget ancestor found. )
        【错误记录】Flutter 界面报错 ( No MediaQuery widget ancestor found. | Scaffold widgets require a MediaQuery )
        【错误记录】Flutter 界面报错 ( No MediaQuery widget ancestor found. | Scaffold widgets require a MediaQuery )
        394 0
        【错误记录】Flutter 界面报错 ( No MediaQuery widget ancestor found. | Scaffold widgets require a MediaQuery )