为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"/>
// :: [Info].[System.Net.Http.HttpClient.bce-request.LogicalHandler].[}].[415.2504]
HTTP request http://localhost:5000/v1/eqid/e741e8d600151edc000000035decf3bf after 415.2504ms end -OK
// :: [Info].[System.Net.Http.HttpClient.bce-request.LogicalHandler].[}].[80.2951]
HTTP request http://localhost:5000/v1/eqid/2a41e8d600151edc000000028decf3bf after 80.2951ms end -OK
// :: [Info].[System.Net.Http.HttpClient.bce-request.LogicalHandler].[}].[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(, "Request End"),
"HTTP request {Url} after {Elapse}ms end -{StatusCode}",
request.RequestUri, stopwatch.Elapsed.TotalMilliseconds, response.StatusCode);
return response;
}
}
--------------------------------2--------------------------------
有简单的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键值对中

--------------------------------------------------------
按照文档的要求,尽量早点注册自定义Nlog LayoutRenderer
public static void Main(string[] args)
{
LayoutRenderer.Register<ElapseLayoutRenderer>("elapse");
......
}
关于将该HttpMessgaeHandler 应用到HttpClientFactory,请参阅 《解剖HttpClientFactory,自由扩展HttpMessageHandler》思路,
本文主要目的为nlog 实现并添加自定义LayoutRenderer.
为NLog自定义LayoutRenderer的更多相关文章
- NLog自定义Target之MQTT
NLog是.Net中最流行的日志记录开源项目(之一),它灵活.免费.开源 官方支持文件.网络(Tcp.Udp).数据库.控制台等输出 社区支持Elastic.Seq等日志平台输出 实时日志需求 在工业 ...
- 转:NLog 自定义日志内容,写日志到数据库;修改Nlog.config不起作用的原因
转:http://www.cnblogs.com/tider1999/p/4308440.html NLog的安装请百度,我安装的是3.2.NLog可以向文件,数据库,邮件等写日志,想了解请百度,这里 ...
- NLog自定义字段写入数据库表,示例
//自定义字段写入NLog日志 private void saveNLog(InvokeLogModel model) { LogEventInfo ei = new LogEventInfo(); ...
- NetCore2.2使用Nlog自定义日志写入路径配置方式
在一些特定场景的业务需求下,日志需要写入到不同的路径下提供日志分析.第一种:默认Nlog可以通过日志级别来区分路径,——优点是不需要额外配置,开箱即用——缺点是不够灵活,如果超过级别数量,则不满足需求 ...
- NLog 自定义字段 写入 oracle
1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴代码 2.建表语句 create table TBL_LOG ( id ) not null, appname ...
- NLog 自定义Target
http://nlog-project.org/2015/06/30/extending-nlog-is-easy.html 新建一个类库,命名规则为NLog.*.dll 定义一个类输出日志到Rabb ...
- [转]NLog 自定义字段 写入 oracle
本文转自:http://www.cnblogs.com/skyapplezhao/p/5690695.html 1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴 ...
- Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持
在这之前打算用Apache的Log4Net,但是发现其AdoNetAppender方法已经不存在了,无法使用配置文件直接输出到数据库了,因此我便改用了NLog框架. 一.对项目添加NLog 通过Nug ...
- NLog 安装使用
1:安装 Install-Package NLog.Config 或 通过Nuget 2:Log levels Trace 非常详细的信息,一般在开发时使用. Debug 比Trace稍微少一点一般不 ...
随机推荐
- 【POJ3744】Scout YYF I
Description YYF是一个英勇的侦查员.现在他正在执行打入到敌方内部的危险任务.在解决了一系列的险情后,YYF到达了敌方著名的"地雷路"起始点.这条路非常长,上面被精心排 ...
- 学习笔记02form
1.<form>为表单标签*如果要把数据提交到服务器,则需要将<input> <textarea> <select>等表单元素放到<from> ...
- 关于多线程start()方法原理解读
1.为什么启动线程不用run()方法而是使用start()方法 run()方法只是一个类中的普通方法,调用run方法跟调用普通方法一样 而start()是创建线程等一系列工作,然后自己调用run里面的 ...
- [考试反思]1028csp-s模拟测试91:预估
这一轮是要闹哪样啊???前十都死活进不去??? 能不能不要到联赛前突然连续掉链子啊!!! 总算难得的切掉了T1.然后又一次把T2和T3的难度估反了 结果给T2剩下了30分钟,想到正解来不及打了. 然后 ...
- 「2019.8.9 考试」神仙的dp总让人无所适从
T1是个容斥,我掐手指一算他为了卡容斥的正确性,绝不会把n和m出的很相近($O(n^2)$算法在nm相等的时候达到最高时间复杂度),不然就太好做了,于是开了特判+各种卡常和滚动数组优化,卡到了70分, ...
- js 重写a标签的href属性和onclick事件
适应场景:假如移动端拨打电话,需要给a标签添加href属性,但是由于需求,需要链接跳转的同时给a标签添加onclick事件,如果不做任何处理的话,默认执行点击事件,而不会跳转href属性的链接. 怎么 ...
- python经典算法题:Z字变形
题目 直接看图! 思路第一步:分组 我们把传入的字符串进行分组, 每个框内的字母为1组: 我们发现每个相同颜色的框内的一组字母的特点是在传入的字符串中是连续的: 我们还发现每组字母的个数是由numRo ...
- HTML创建图像映射,布局,表单
来源: 实验楼 创建图像映射 在这之前我们动手试验过将图片作为链接来使用,触发链接的方式就是点击图片的任何地方都可以链接到跳转地址,有时我们需要实现,点击图片的不同地方跳转到不同的地方.意思就是,一张 ...
- vue-cli中使用less
先安装less,less-loader npm install less less-loader --save-dev,你会在package.json中看到图下 之后不用配置就可以在项目中用less了 ...
- 张孝祥java高新技术 --- jkd1.5 新特性
1. 静态导入 import static java.lang.Math.max; 2. 可变参数 3. 自动装箱,拆箱 4. 枚举