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 

扫一扫左边二维码,
更多干货等着你。
............

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode动态规划 跳跃游戏II

给你一个非负整数数组 nums &#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 假设你总是可以到达数组的最后一个位置。 这道题用动态规划做&#xff0c;时间复杂度很高 …

一文了解Nuget的使用

Nuget介绍官网定义&#xff1a;NuGet是.NET的软件包管理器&#xff08;免费&#xff09;。NuGet客户端工具提供了生成和使用软件包的能力。NuGet Gallery 是所有软件包作者和消费者都使用的中央软件包存储库。简单来说&#xff0c;nuget包解决了dll引用的问题&#xff0c;开发者…

银行家算法 C++实现

操作系统模拟之银行家算法。 文件共4份&#xff0c;其中1份cpp&#xff0c;3份.h&#xff0c;代码如下&#xff1a; main.cpp #include <iostream> #include <stdlib.h> #include "initialize.h" #include "check.h" #include "apply.h…

.NET 应用程序支持直接调用 WebAssembly 模块

WebAssembly Runtime 现已添加 .NET Core API&#xff0c;开发者可直接在 .NET 应用程序中调用 WebAssembly 模块。Mozilla 宣布由 Bytecode Alliance 创建的 Wasmtime&#xff08;WebAssembly runtime&#xff09;现已添加处于早期预览版状态的 .NET Core API&#xff0c;这就…

进程调度算法 C++实现

操作系统模拟之进程调度算法。 文件共2份&#xff0c;其中1份cpp&#xff0c;1份.h&#xff0c;代码如下&#xff1a; main.cpp #include "init.h"int main() {printf("欢迎进入演示系统&#xff01;\n");printf("\n现在需要对进程数据初始化\n&quo…

《RPA、AI、.NET Core 与未来》-中国.NET开发者峰会

未 来第四次工业革命&#xff0c;催生了数字自动化劳动&#xff0c;RPA 与 AI 技术的融合&#xff0c;成为智能信息社会的重要环节。当下RPA平台主要采用.NET Framework框架&#xff0c;也限制了 RPA 只用于 Windows 平台。.NET Core 的开放与跨平台特性赋予RPA更大发展空间。…

地址转换算法 C++实现

操作系统模拟之地址转换算法。 文件共3份&#xff0c;其中1份cpp&#xff0c;2份.h&#xff0c;代码如下&#xff1a; main.cpp #include "init.h"int main() {printf("欢迎进入演示系统&#xff01;\n");printf("\n现在需要对进程数据初始化\n&quo…

浅议gRPC的数据传输机制和回调机制

本文来自DotNET技术圈作者&#xff1a;溪源一、引子如您所知&#xff0c;gRPC是目前比较常见的rpc框架&#xff0c;可以方便的作为服务与服务之间的通信基础设施&#xff0c;为构建微服务体系提供非常强有力的支持。而基于.NET Core的gRPC.NET 组件截至2019年11月30日的最新版本…

请求分页算法 Python实现

操作系统模拟之请求分页算法。 文件共1份&#xff0c;代码如下&#xff1a; import math import os import random import copydef alo_opt():print("您选择了OPT算法&#xff0c;执行结果如下&#xff1a;")print("访问页面 物理块 缺页中断")temp_que…

如何在 Visual Studio 2019 中连接中国版 Azure

点击上方蓝字关注“汪宇杰博客”导语做国内项目很可能用到中国版的 Azure&#xff0c;即世纪互联运营的 azure.cn。然而 Visual Studio 2019 默认连接的是国际版的 Azure&#xff0c;如何添加中国版订阅呢&#xff1f;差点9966年前我曾经写过一篇《图解&#xff1a;如何在Visua…

磁盘寻道算法 Python实现

操作系统模拟之磁盘寻道算法。 文件共1份&#xff0c;代码如下&#xff1a; import math import random import copydef alo_fcfs():print("您选择了FCFS算法&#xff0c;执行结果如下&#xff1a;")print("当前磁道号 下一磁道号 绝对差")print({:6d}{:1…

k8s 使用 Init Container 确保依赖的服务已经启动

k8s 使用 Init Container 确保依赖的服务已经启动Intro最近 helm 3 正式发布了&#xff0c;dotnetcore 3.1 也正式发布了&#xff0c;最近打算把我的活动室预约项目做一个升级&#xff0c;项目已经升级到了 dotnetcore 3.1&#xff0c;最近几天则在准备把项目打包一个 helm 包&…

LeetCode动态规划 最大子序和

给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 ps&#xff1a; 清华大学912曾经考过。 状态转移方程 dp[i] max(nums[i], dp[i-1] nums[i]) 边界条件 dp[0] nums[0] 代码…

dotNET面试题汇总系列连载(1):基础语法

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约4000字&#xff0c;预计阅读时间8分钟马上要到2020年了&#xff0c;这里整理一个.NET 工程师面试题系列&#xff0c;希望年底或者明年金三银四跳槽的程序猿们带…

LeetCode动态规划 环形子数组的最大和

给定一个由整数数组 A 表示的环形数组 C&#xff0c;求 C 的非空子数组的最大可能和。 此外&#xff0c;子数组最多只能包含固定缓冲区 A 中的每个元素一次。 思路 本道题需要分类成两种情况&#xff0c;题目答案为以下两种情况的较大值。 1.最大子区间在序列的中间 这种情况是…

Blazor 版 Bootstrap Admin 通用后台权限管理框架

前言上一篇介绍过了前后台分离的 NET Core 通用权限管理系统 在这篇文章简要的介绍了 Bootstrap Admin 后台管理框架的一些功能。本篇文章带来的是微软最新出的 Blazor 版本的 NET Core 通用权限管理系统Blazor 简介至于 Blazor 是什么&#xff0c;Blazor 的优缺点小伙伴们可以…

xms跨平台基础框架 - 基于.netcore

背景鄙人经过多年开发&#xff0c;数百个项目“打磨(折磨)”&#xff0c;各种国内外框架平台都有涉及&#xff0c;没有一款称心顺手的&#xff0c;原因有三&#xff0c;一是设计反人类&#xff0c;二是不开源根本无法突破框架限制&#xff0c;三是即使开源也是阉割版&#xff0…

如何让 Azure AD 里的应用只允许特定用户登录

点击上方蓝字关注“汪宇杰博客”导语我的博客系统支持 Azure Active Directory 身份认证&#xff0c;然而用VS点点鼠标配出来的 Azure 应用&#xff0c;默认情况下会允许所有 AAD 内的用户访问&#xff0c;如何限制为只让特定用户访问呢&#xff1f;背景情况其实最近&#xff0…

程序员:这10种糟糕的程序命名,你遇到过几个?

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约2300字&#xff0c;预计阅读时间4分钟有人问&#xff1a;规范的命名风格真的能让你程序员少出bug&#xff1f;当遇到这方面的教训时&#xff0c;就会想到这句话…

评测OJ时间复杂度

平日里做OJ题时&#xff0c;先看数据范围能帮助自己选择算法 &#xff08;可能更多时候是看暴力能骗到几分qwq) 一般而言&#xff0c;评测OJ在1s内能接受的算法时间复杂度是10e8-10e9之间&#xff0c;这里取折中值5*10e8。 对于不同的算法&#xff0c;能够接受的最大数据如下&…