长话短说

  前文《解剖HttpClientFactory,自由扩展HttpMessageHandler》主要想讲如何扩展HttpMessageHandler,  示例为在每个Http请求中的日志中显示TraceId,

写入日志的代码拷贝自 Extension.Logging 源码, 这个日志源码其实无法 完成我课后的小作业: 将TraceId显示到Nlog的LayoutRenderer上。

本次重新实现一个流畅简单的  LoggingHttpMessageHandler, 并添加到 nlog layoutrenderer。

什么是Layout Renderer?

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

头脑风暴

先给出自定义Renderer,定义名为eqid的自定义Renderer

# 截取自 nlog.config配置文件
<variable name="format1" value="${date:format=yy/MM/dd HH\:mm\:ss} [${level}].[${logger}].[${threadid}}].[${aspnet-request-url:IncludeScheme=false:IncludeHost=false}].[${eqid}]${newline}${message} ${exception:format=tostring}" />

<target name="bce-request"
           xsi:type="File"
           layout="${format1}"
           fileName="${logDir}/bce-request.log"
           encoding="utf-8"/>

-------------------------------------1----------------------------

Nlog 添加自定义LayOutRenderer, https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer

  有简单的lambda方式,这里我们采用稍微灵活的自定义类方式:

 [LayoutRenderer("eqid")]
    public class EqidLayoutRenderer : LayoutRenderer
    {
        protected override void Append(StringBuilder builder, LogEventInfo logEvent)
        {
            builder.Append(logEvent.Properties["EventId_Name"].ToString());
        }
    }

关键点是实现 LayoutRenderer 的抽象方法 Append,  关键参数 logevent是写入Logging时候的附带参数

以上我打算从 logEventInfo的某个property中存储 该Renderer值,所以上如上取值方式。

---------------------------------2---------------------

配合着,我们在写入日志时, 也在该property 中写入该Renderer的值:

public class AttachTraceIdScopeHttpMessageHandler : 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 eventName = request.RequestUri.LocalPath.Split('/').LastOrDefault();

            _logger.Log(LogLevel.Information, , eventName),
                $"Start processing HTTP request {request.RequestUri} {request.Method}");
            var response = await base.SendAsync(request, cancellationToken);
            stopwatch.Stop();
            _logger.Log(LogLevel.Information, , eventName),
                $"End processing HTTP request after {stopwatch.Elapsed.TotalMilliseconds}ms - {response.StatusCode}");
            return response;
        }
    }

EventId 中的Name属性,最后在 nlog的 EventLogInfo中被认定为 Property[EventId_Name], 所以我们有以上操作。

按照上文方式,添加到 CustomHttpMessageHandlerFilter,并注册为 IHttpMessageHandlerFilter 实现。

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

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

因此我在 main函数开始的时候就注册了该Renderer, 注册名称是TraceId

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

最终输出如下:

// :: [Info].[System.Net.Http.HttpClient.bce-request.LogicalHandler].[}].[].[125aa91f0011426c000000045dea5ea0]
Start processing HTTP request http://localhost:5000/v1/eqid/125aa91f0011426c000000045dea5ea0 GET
// :: [Info].[System.Net.Http.HttpClient.bce-request.LogicalHandler].[}].[].[125aa91f0011426c000000045dea5ea0]
End processing HTTP request after .9971ms - OK 

ok, 阅读本文,请务必参阅 《解剖HttpClientFactory,自由扩展HttpMessageHandler》思路,解剖HttpClientFactory之后,再结合Nlog LayoutRenderer.

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

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

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

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

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

  3. NLog 自定义字段 写入 oracle

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

  4. NLog 自定义Target

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

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

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

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

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

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

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

  8. NLog 安装使用

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

  9. 使用 NLog 给 Asp.Net Core 做请求监控

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

随机推荐

  1. openfire 连接sqlserver 2008 的一个问题

    由于本人的笨拙,搞了一天才终于搞好,说实在的问题归根结底还是在sql上,要相信openfire是没问题的.好了,不瞎扯了,说正题. 本人的机器环境为:win7.sqlserver 2008.jdk1. ...

  2. 2.Sprng-IoC-Java反射例子

    1.Car.java package com.jike.spring.chapter03.reflect; public class Car { private String brand; priva ...

  3. SQL Server 通配符 Wildcard character

    SQL Server 通配符 Wildcard character %        任意长度的字符串,如:'%computer%' _        单个字符,如:'_ean' []        ...

  4. 家庭局域网接入Internet

     接入Internet  建立宽带连接 步骤一:单击"网络",再属性 步骤二:单击"更改适配器设置" 步骤三:选择"宽带连接" 步骤四:输入 ...

  5. Linux查找软件的安装路径

    软件安装的路径可能不止一个,可以使用whereis命令查看软件安装的所有路径,以mysql为例: whereis mysql 该命令会返回软件的所有安装路径: mysql: /usr/bin/mysq ...

  6. HDOJ 1214 圆桌会议

    Problem Description HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家的讨论后一 ...

  7. Ubuntu下搜狗输入法突然无法输入中文

    百度了很久的,后面看到这个帖子,找到解决办法.引用:http://blog.csdn.net/kiss_the_sky/article/details/62238529 删除配置文件,重启搜狗 ubu ...

  8. [USACO4.2]草地排水Drainage Ditches

    题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草 要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹 ...

  9. ajax数据请求2(json格式)

    ajax数据请求2(json格式) <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  10. DotNetCore跨平台~关于appsettings.json里各种配置项的读取

    回到目录 对于dotnet Core来说,依赖注入的集成无疑是最大的亮点,它主要用在服务注册与注入和配置文件注册与注入上面,我们一般会在程序入口先注册服务或者文件,然后在需要的地方使用注入即可,下面主 ...