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相关推荐
- Fragment的布局中自定义Layout的onSizeChanged添加组件失败的问题
今天想做点东西,有些部分觉得用fragment比较合适,而且自己以前没有用过这个,正好练习练习.刚开始搞没多久就遇上了一个问题..... 情况是这样的,有俩个fragment,在activity创建的 ...
- UICollectionView自定义Layout教程
本文来自RAYWENDERLICH网站,上面有一系列的IOS教程,都写得十分精彩,大家可以上去看看.本文对于原文有所删改.因为Swift的语法进行了更新,打开工程的时候会提示更新语法,点击是就行了. ...
- nlog自定义文件名
Nlog.config文件 <variable name="logDirectory" value="${basedir}/logs/"/> < ...
- NLog自定义字段写入数据库表,示例
//自定义字段写入NLog日志private void saveNLog(InvokeLogModel model) { LogEventInfo ei = new LogEventInfo(); e ...
- Android自定义Layout
在开发Android过程中,有时已有的Loyout布局不能完全满足设计需求,这时需要在已有的Layout基础上上进行扩展,以达到通过配置文件描述布局的设计原则. 首先第一一个布局类,重写其onDraw ...
- [转]NLog学习笔记二:深入学习
本文转自:http://www.cnblogs.com/CCHUncle/p/5207735.html 配置文件 NLog所有的配置信息都可以写到一个单独的xml文件中,也可以在程序代码中进行配置. ...
- Nlog详解---非常详细
一.Nlog详解 1.概述 NLog是一个基于.NET平台编写的日志记录类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.可以在任何一种.NET语言中输出带有上下文的(contextu ...
- conversionpattern(conversionpattern 自定义字段)
请教以下log4j 日志文件不会弄啊. 直接在Myeclipse中编辑properties 文件的时候不能使用中文的.你可以下载个插件,或者干脆在外边编辑~~你用一个类去读,然后在里面用logger去 ...
- invoke方法是做啥的_使用 NLog 给 Asp.Net Core 做请求监控
为了减少由于单个请求挂掉而拖垮整站的情况发生,给所有请求做统计是一个不错的解决方法,通过观察哪些请求的耗时比较长,我们就可以找到对应的接口.代码.数据表,做有针对性的优化可以提高效率.在 asp.ne ...
最新文章
- rgb和yuv的区别
- shell字符串的处理
- oh-my-robot
- poj 3378 Crazy Thairs
- deepin-Code::Blocks安装与配置
- Safe Or Unsafe(hdu2527)哈弗曼VS优先队列
- 2021年系统架构设计师考试大纲
- oracle 范鑫_20集 JAVA数据库连接视频教程 JAVA能力提升专题视频教程 JDBC动力节点视频教程,全套视频教程学习资料通过百度云网盘下载...
- visio2003中、origin中、matlab中,字体的大小以pt为单位,与word中的几号字大小是如何对应?
- 苹果计算机如何显示错误,科普电脑打开苹果手机视频教程及Apple ID验证失败发生未知错误怎么解决...
- 公共基础知识:地震逃生注意事项
- MQTT学习笔记——Yeelink MQTT服务 使用mqtt.js和paho-mqtt
- python爬虫网易云音乐评论最多的歌_Python3实战之爬虫抓取网易云音乐的热门评论...
- 【模拟IC】时钟馈通效应减小及仿真验证
- python爬取公众号阅读量_分享一个牛逼的Python项目:公众号文章爬虫
- python+openCV 获取背景(三)
- unity 摄像头跟着鼠标移动_unity第三视角移动,摄像机跟随
- 调用notifyDataSetChanged无法更新ListView
- 通过wifi对手机进行adb连接debug调试 adb connect ip_address:5555
- wampserver 安装完后一直橙色的处理
热门文章
- 转载 Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- Windbg在Managed App中设置函数断点的几种方法
- 经典正则表达式(转)
- 代码评审会议_如何将电话会议(和访问代码)另存为联系人
- php xxtea加密,php - esp32和php XXTEA字符串加密 - SO中文参考 - www.soinside.com
- VS2015不能修改安装路径问题
- Handler 机制分析
- 安装分布式文件系统MooseFS
- SIP for android
- MFC socket网络编程(流程示例)