前言

  .NetCore日志,相信大家多少都接触过,博客园有关 ① AspNetCore依赖注入第三方日志组件   ②第三方日志组件Nlog,Serilog 应用方法的博文层出不穷。

结合程序的部署结构,本文分单体和微服务聊一聊AspNetCore中追踪日志流的方法。

TraceID作用和组成

TraceID标记了 浏览器发起的某个请求, 这个id可在服务端从接收请求到 响应请求中流转,甚至接力传递给下游应用中流转,用于唯一标记和定外这次请求。

一般用于定位请求日志。

  ASP.Net Core 基于中间件管道处理请求, 根据需要记录日志; 生产出故障时,在数量庞大的日志记录中追踪某个请求完整的处理链显得很有必要(这个深有体会)。

针对单体程序,ASP.Net Core为我们提供了HttpContext.TraceIdentifier属性, 这个TraceId由{ConnectionId}:{Request Number}组成,理论上这个id标记了位于某Http连接上的某次请求。

① 为什么由 {ConnectionId}:{Request Number}组成?

默认大部分读者知晓Http1.1 一个连接上可发起多个Http请求

② TraceId 中ConnectionId由Kestrel从{0-9,a-z}中生成,可参考:https://github.com/aspnet/KestrelHttpServer/blob/a48222378b8249a26b093b5b835001c7c7b45815/src/Kestrel.Core/Internal/Infrastructure/CorrelationIdGenerator.cs

ok, 现在着重聊一下使用方式和衍生知识点

ASP.NET Core使用TraceId

搭配Nlog记录TraceId

① 启用NLog日志

添加  <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.0" />

public class Program
{
public static void Main(string[] args)
{
var webHost = WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, configureDelagate) =>
{
configureDelagate.AddJsonFile($"appsettings.secrets.json", optional: true, reloadOnChange: true);
})
.ConfigureLogging((hostingContext, loggingBuilder) =>
{
loggingBuilder.AddConsole().AddDebug();
})
.UseNLog() // 默认会找工作目录下nlog.config配置文件
.UseStartup<Startup>()
.Build();
webHost.Run();
}
}

很明显,Nlog要在Pipeline中自由获取HttpContext属性,这里需要

② 注册IHttpContextAccessor

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
}

③ 配置Nlog 显示TraceId

TraceId在Nlog 是以Layout Renderer形式表达的:

更多的Renderer参考。下面的Nlog配置文件呈现了TraceId & User_Id(业务上的UserId能帮助我们在茫茫日志中快速缩小日志)

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" throwExceptions="false" internalLogFile="internal-nlog.txt">
<variable name="logDir" value="logs/${date:format=yyyyMMdd}" /> <!-- 日志存储文件夹-->
<variable name="format" value="${date:format=yy/MM/dd HH\:mm\:ss} [${level}].[${logger}].[${aspnet-TraceIdentifier}].[${aspnet-user-identity}]${newline}${message} ${exception:format=tostring}" />
<targets>
<target name="info"
xsi:type="File"
layout="${format}"
fileName="${logDir}/info.log"
encoding="utf-8"/>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="info" />
</rules>
</nlog>

结果如下:

以上是在单体程序内根据traceid追踪请求流的方法。

进一步思考,在微服务中,各服务独立形成TraceId,在初始阶段生成 TraceId 并在各微服务中保持该Traceid即可追踪微服务的请求流

ASP.NET Core分布式TraceId:CorrelationId

这里首先假设你的微服务/ 分布式服务已经部署ELK 等日志几种采集处理框架,没有部署ELK也可将多个服务的日志写到同一个物理文件夹。

  隆重介绍轮子 CorrelationId: https:/github.com/stevejgordon/CorrelationId

CorrelationId是通过自定义Header来标记TraceId概念

  • CorrelationId 在首次收到请求时自定义名为【X-Correlation-ID】 的请求头,在本服务Response写入该Header

  • 后置服务检测到请求头中包含该Header, 将该CorrelationId作为本服务的TraceId 向后流转

这样在集中日志中,能通过某TraceID追踪微服务/分布式 全链路请求处理日志。

使用方式也相当简单:

// Install-Package CorrelationId -Version 2.1.0

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddCorrelationId();
}

一般在所有请求处理Middleware之前注册 CorrelationId, 这样在所有中间件就能获取到 TraceId:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCorrelationId(); if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseMvc();
}

打算应用该TraceId追踪全流程请求日志的服务都需要包含 中间件。

Ok, 本文聊一聊TraceID的作用和一般组成,衍生出ASP. NETCore  单体和分布式程序中 TraceId 的使用方式, 希望对大家在日志排障时有所帮助。

TraceID在AspNETCore日志排障中的应用的更多相关文章

  1. 【排障】tomact未能看到网页

    [排障]tomact未能看到网页 文:食梦貘 这是几个月前的事情了,那时候我在安装xwiki,需要用到tomcat,但是初次安装好时碰上过一个故障: 安装tomcat后,客户机用IE网址上输入:服务端 ...

  2. 记一次KUBERNETES/DOCKER网络排障

    https://coolshell.cn/articles/18654.html 总结在前面: 1.kill -9杀死docker进程,系统一定是要遍历所有的docker子进程来一个一个发退出信号的, ...

  3. 如何进行kubernetes问题的排障

    排障的前置条件 k8s的成熟度很高,伴随着整个项目的扩增,以及新功能和新流程的不断引入,也伴随这产生了一些问题.虽然自动化测试可以排除掉大部分,但是一些复杂流程以及极端情况却很难做到bug的完全覆盖. ...

  4. [转帖]记一次KUBERNETES/DOCKER网络排障

    记一次KUBERNETES/DOCKER网络排障 https://coolshell.cn/articles/18654.html 记得之前在一个公众号里面看过这个文章 讲的挺好的.. 物理机直接跑d ...

  5. 【思考】由安装zabbix至排障php一系列引发的思考

    [思考]由安装zabbix至排障php一系列引发的思考 linux的知识点林立众多,很有可能你在排查一个故障的时候就得用到另一门技术的知识: 由于linux本身的应用依赖的库和其它环境环环相扣,但又没 ...

  6. 【原】个人对win7开机黑屏只有鼠标排障总结

    个人对win7开机黑屏只有鼠标排障总结 文:铁乐猫 第一种情况是explorer.exe进程丢失或损坏有关: 判断方法是按Ctrl+Alt+Del键能呼出任务管理器,结束explorer.exe进程, ...

  7. [转]Traceroute网络排障实用指南(2)

    五.优先级与限速 5.1 Traceroute延时判断影响因素 Traceroute延时包括三点: 探测包到达一个特定路由器的时间 路由器生成IPMI TTL Exceed的时间 ICMP TTL E ...

  8. 系统之锹sysdig:Linux服务器监控和排障利器

    当你需要追踪某个进程产生和接收的系统调用时,首先浮现在你脑海中的是什么?你可能会想到strace,那么你是对的.你会使用什么样的命令行工具来监控原始网络通信呢?如果你想到了tcpdump,你又作出了一 ...

  9. MongoDB系统CentOS 7.1 crash的排障过程

    [作者] 王栋:携程技术保障中心数据库专家,对数据库疑难问题的排查和数据库自动化智能化运维工具的开发有强烈的兴趣. [问题描述] 最近我们有多台MongoDB的服务器CentOS 7.1系统发生了cr ...

随机推荐

  1. 查看线上日志利器less

    less实用命令 搜索 很多关于命令的解释有点令人困惑,因为前字,forward是向前,before也是前面. 上表示backward 下表示forward 向下搜索 / - 使用一个模式进行搜索,并 ...

  2. 实现文字色彩渐变(Mask)

    文字色彩渐变是指的文字本身的颜色,不是背景渐变.要实现此效果可以采用Mask组件,本文先从介绍mask说起 1)Mask介绍 mask组件实现的作用是,mask组件所在游戏物体下的子游戏物体在mask ...

  3. carousel.html

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. iOS 原生库对 https 的处理

    转载自:swift cafe 使用 NSURLSession NSURLSession 是 iOS 原生提供的网络处理库.它提供了丰富的接口以及配置选项,满足我们平时网络处理的大部分需求,同时它也支持 ...

  5. 前后端对称加密(AES)

    后端实现(JAVA) package com.vcgeek.hephaestus.demo; import org.apache.commons.codec.binary.Base64; import ...

  6. JAVA中的NIO (New IO)

    简介 标准的IO是基于字节流和字符流进行操作的,而JAVA中的NIO是基于Channel和Buffer进行操作的. 传统IO graph TB; 字节流 --> InputStream; 字节流 ...

  7. oracle数据库锁表,什么SQL引起了锁表?ORACLE解锁的方法

    --查询数据库锁表记录 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.l ...

  8. [git]将代码上传到github

    1.右键你的项目,如果你之前安装git成功的话,右键会出现两个新选项,分别为Git Gui Here,Git Bash Here,这里我们选择Git Bash Here,进入如下界面 2.接下来输入如 ...

  9. Python编程 Notepad++和Pycharm设置

    Notepad++ 一.缩进 初学Python的同学需要注意python的缩进,官方鼓励用4个空格缩进, 这时需要注意Tab键与空格的区分.使用Notepad++的同学可以在设置-首选项-制表符宽度中 ...

  10. NOIP模拟21+22

    模拟21确实毒瘤...考场上硬刚T3 2.5h,成功爆零 T1.数论 看这题目就让人不想做,考场上我比较明智的打完暴力就弃掉了,没有打很久的表然后找规律. 正解貌似是乱搞,我们考虑一个比较显然的结论: ...