更多精彩内容请关注我们

长话短说

前文《解剖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相关推荐

  1. Fragment的布局中自定义Layout的onSizeChanged添加组件失败的问题

    今天想做点东西,有些部分觉得用fragment比较合适,而且自己以前没有用过这个,正好练习练习.刚开始搞没多久就遇上了一个问题..... 情况是这样的,有俩个fragment,在activity创建的 ...

  2. UICollectionView自定义Layout教程

    本文来自RAYWENDERLICH网站,上面有一系列的IOS教程,都写得十分精彩,大家可以上去看看.本文对于原文有所删改.因为Swift的语法进行了更新,打开工程的时候会提示更新语法,点击是就行了. ...

  3. nlog自定义文件名

    Nlog.config文件 <variable name="logDirectory" value="${basedir}/logs/"/> < ...

  4. NLog自定义字段写入数据库表,示例

    //自定义字段写入NLog日志private void saveNLog(InvokeLogModel model) { LogEventInfo ei = new LogEventInfo(); e ...

  5. Android自定义Layout

    在开发Android过程中,有时已有的Loyout布局不能完全满足设计需求,这时需要在已有的Layout基础上上进行扩展,以达到通过配置文件描述布局的设计原则. 首先第一一个布局类,重写其onDraw ...

  6. [转]NLog学习笔记二:深入学习

    本文转自:http://www.cnblogs.com/CCHUncle/p/5207735.html 配置文件 NLog所有的配置信息都可以写到一个单独的xml文件中,也可以在程序代码中进行配置. ...

  7. Nlog详解---非常详细

    一.Nlog详解 1.概述 NLog是一个基于.NET平台编写的日志记录类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.可以在任何一种.NET语言中输出带有上下文的(contextu ...

  8. conversionpattern(conversionpattern 自定义字段)

    请教以下log4j 日志文件不会弄啊. 直接在Myeclipse中编辑properties 文件的时候不能使用中文的.你可以下载个插件,或者干脆在外边编辑~~你用一个类去读,然后在里面用logger去 ...

  9. invoke方法是做啥的_使用 NLog 给 Asp.Net Core 做请求监控

    为了减少由于单个请求挂掉而拖垮整站的情况发生,给所有请求做统计是一个不错的解决方法,通过观察哪些请求的耗时比较长,我们就可以找到对应的接口.代码.数据表,做有针对性的优化可以提高效率.在 asp.ne ...

最新文章

  1. rgb和yuv的区别
  2. shell字符串的处理
  3. oh-my-robot
  4. poj 3378 Crazy Thairs
  5. deepin-Code::Blocks安装与配置
  6. Safe Or Unsafe(hdu2527)哈弗曼VS优先队列
  7. 2021年系统架构设计师考试大纲
  8. oracle 范鑫_20集 JAVA数据库连接视频教程 JAVA能力提升专题视频教程 JDBC动力节点视频教程,全套视频教程学习资料通过百度云网盘下载...
  9. visio2003中、origin中、matlab中,字体的大小以pt为单位,与word中的几号字大小是如何对应?
  10. 苹果计算机如何显示错误,科普电脑打开苹果手机视频教程及Apple ID验证失败发生未知错误怎么解决...
  11. 公共基础知识:地震逃生注意事项
  12. MQTT学习笔记——Yeelink MQTT服务 使用mqtt.js和paho-mqtt
  13. python爬虫网易云音乐评论最多的歌_Python3实战之爬虫抓取网易云音乐的热门评论...
  14. 【模拟IC】时钟馈通效应减小及仿真验证
  15. python爬取公众号阅读量_分享一个牛逼的Python项目:公众号文章爬虫
  16. python+openCV 获取背景(三)
  17. unity 摄像头跟着鼠标移动_unity第三视角移动,摄像机跟随
  18. 调用notifyDataSetChanged无法更新ListView
  19. 通过wifi对手机进行adb连接debug调试 adb connect ip_address:5555
  20. wampserver 安装完后一直橙色的处理

热门文章

  1. 转载 Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  2. Windbg在Managed App中设置函数断点的几种方法
  3. 经典正则表达式(转)
  4. 代码评审会议_如何将电话会议(和访问代码)另存为联系人
  5. php xxtea加密,php - esp32和php XXTEA字符串加密 - SO中文参考 - www.soinside.com
  6. VS2015不能修改安装路径问题
  7. Handler 机制分析
  8. 安装分布式文件系统MooseFS
  9. SIP for android
  10. MFC socket网络编程(流程示例)