长话短说

  前文《解剖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--------------------------------

添加自定义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键值对中

--------------------------------------------------------

按照文档的要求,尽量早点注册自定义Nlog LayoutRenderer

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

关于将该HttpMessgaeHandler 应用到HttpClientFactory,请参阅 《解剖HttpClientFactory,自由扩展HttpMessageHandler》思路,

本文主要目的为nlog 实现并添加自定义LayoutRenderer.

为NLog自定义LayoutRenderer的更多相关文章

  1. NLog自定义Target之MQTT

    NLog是.Net中最流行的日志记录开源项目(之一),它灵活.免费.开源 官方支持文件.网络(Tcp.Udp).数据库.控制台等输出 社区支持Elastic.Seq等日志平台输出 实时日志需求 在工业 ...

  2. 转:NLog 自定义日志内容,写日志到数据库;修改Nlog.config不起作用的原因

    转:http://www.cnblogs.com/tider1999/p/4308440.html NLog的安装请百度,我安装的是3.2.NLog可以向文件,数据库,邮件等写日志,想了解请百度,这里 ...

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

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

  4. NetCore2.2使用Nlog自定义日志写入路径配置方式

    在一些特定场景的业务需求下,日志需要写入到不同的路径下提供日志分析.第一种:默认Nlog可以通过日志级别来区分路径,——优点是不需要额外配置,开箱即用——缺点是不够灵活,如果超过级别数量,则不满足需求 ...

  5. NLog 自定义字段 写入 oracle

    1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴代码 2.建表语句 create table TBL_LOG ( id ) not null, appname ...

  6. NLog 自定义Target

    http://nlog-project.org/2015/06/30/extending-nlog-is-easy.html 新建一个类库,命名规则为NLog.*.dll 定义一个类输出日志到Rabb ...

  7. [转]NLog 自定义字段 写入 oracle

    本文转自:http://www.cnblogs.com/skyapplezhao/p/5690695.html 1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴 ...

  8. Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持

    在这之前打算用Apache的Log4Net,但是发现其AdoNetAppender方法已经不存在了,无法使用配置文件直接输出到数据库了,因此我便改用了NLog框架. 一.对项目添加NLog 通过Nug ...

  9. NLog 安装使用

    1:安装 Install-Package NLog.Config 或 通过Nuget 2:Log levels Trace 非常详细的信息,一般在开发时使用. Debug 比Trace稍微少一点一般不 ...

随机推荐

  1. 【CF696D】Legen...(AC自动机)(矩阵快速幂)

    题目描述 Barney was hanging out with Nora for a while and now he thinks he may have feelings for her. Ba ...

  2. TCP/IP协议第一卷第一章

    1.链路层 链路层有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节.把链路层地址和网络层地址联系起来 ...

  3. 如何让elemengUI中的表格组件相同内容的单元格自动合并

    1. 前言 这两天在工作中遇到这样一个需求:将某个Excel中的数据在页面上以表格形式展示出来,并且尽量保持数据层级与Excel中一致.在原始Excel文件中,对每一行相同的数据都进行了合并,使得数据 ...

  4. js中 对象名.属性名和对象名['属性名']的区别,.和[]的区别

    对象中的对象名[ ' 属性名 ' ] 和 对象名.属性名的区别 话不多少,上图分析,菜鸟刚学几个月,如有错误,欢迎大佬们指出 这里是很显而易见的! 然后我们用for in 对他进行遍历,他的区别就出来 ...

  5. 私有git搭建

    Git简介(目前世界上最先进的分布式版本控制系统) 那什么是版本控制系统? 你可以把一个版本控制系统(缩写VCS)理解为一个特殊的“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照.当你需要 ...

  6. JDBC事务的简单使用

    在实际功能当中,经常会碰到同时对一组数据进行增加和减少,最常见的就是交易功能. 事务内执行的语句,要么都成功,要么都失败,如果有一句没执行成功,整个事务都不会提交的. import java.sql. ...

  7. hdu 2444 The Accomodation of Students (判断二分图,最大匹配)

    The Accomodation of StudentsTime Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  8. nyoj 324-猴子吃桃问题 (m[i] = (m[i-1] + 1) * 2)

    324-猴子吃桃问题 内存限制:64MB 时间限制:3000ms 特判: No 通过数:20 提交数:21 难度:0 题目描述: 有一堆桃子不知数目,猴子第一天吃掉一半,又多吃了一个,第二天照此方法, ...

  9. 力扣(LeetCode)买卖股票的最佳时机 个人题解

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...

  10. for循环的更多写法

    在看设计模式这本书,遇到一个令人疑惑的for循环语句 for (var i = 0, type;type = ['String', 'Array', 'Number'][i++]) { 代码块 } 比 ...