.NET Core集成CorrelationId实现全链路日志输出
.NET Core集成CorrelationId实现全链路日志输出
一,链路追踪
随着微服务架构的流行,一次请求会涉及多个服务的调用,并且服务本身也可能会依赖其他服务,整个请求路径会构成一个调用链,当某个节点发生异常时,整个调用链的稳定性都会受到影响,由此APM(应用性能管理)应运而生。
APM可以用于分布式追踪、性能指标分析、应用和服务依赖分析等,可以帮助理解系统行为和分析性能问题。
常见的APM有SkyWalking,Cat、Zipkin、Pinpoint等。其中,SkyWalking可以通过SkyAPM-dotnet集成,Zipkin可以通过zipkin4net集成,对SkyWalking有兴趣的童鞋可以看我另外一篇文章《.NET Core集成SkyWalking+SkyAPM-dotne实现分布式链路追踪》。
虽然APM可以捕捉到整个链路请求,但个人感觉在日志层面还是比较薄弱,更多的还是用于性能分析和追踪。
在实际的生产应用中,大部分的异常更多的是业务异常,APM并不能对日志的定位寻找产生太大帮助,最好的方案还是在日志中输出请求链路的唯一标识,利用唯一标识,我们可以很容易的在日志中心中把请求链路的所有日志检索出来。
二,CorrelationId
CorrelationId会在请求中产生一个唯一标识,并可以将唯一标识作为一个Header传递到下一请求,以此类推,从而整个链路都可以获取到这个标识,并自主打印到日志当中。
下面来看一下详细的实现:
安装nuget包CorrelationId

修改Startup.cs
1.注入组件,可不声明option,UpdateTraceIdentifier = true会自动更新httpcontext中TraceIdentifier字段
1 services.AddDefaultCorrelationId(options =>
2 {
3 //options.CorrelationIdGenerator = () => "Foo";
4 //options.AddToLoggingScope = true;
5 //options.EnforceHeader = true;
6 //options.IgnoreRequestHeader = false;
7 //options.IncludeInResponse = true;
8 //options.RequestHeader = "My-Custom-Correlation-Id";
9 //options.ResponseHeader = "X-Correlation-Id";
10 options.UpdateTraceIdentifier = true;
11 });
2.同一链路中所有节点需声明同一个Client名称,加入此句才能将CorrelationId传递出去
services.AddHttpClient("MyClient")
.AddCorrelationIdForwarding()
3.
app.UseCorrelationId();
到此,单个应用节点就已经配置完成了,是不是so easy。同理,其他应用节点也是这么配置。
下面,我们来使用这个唯一标识
声明ICorrelationContextAccessor对象,并通过构造函数注入
public class TransientClass
{
private readonly ICorrelationContextAccessor _correlationContext; public TransientClass(ICorrelationContextAccessor correlationContext)
{
_correlationContext = correlationContext;
} ...
}
通过_correlationContextAccessor对象即可获取到唯一标识,后续输出日志时,便可打印出来
_logger.LogInformation($"[{_correlationContextAccessor.CorrelationContext.CorrelationId}]我是A");
需要特别注意的是,如调用的是gRPC服务,header默认是空的,无法通过配置直接带过去,需要手动传递
var header = new Grpc.Core.Metadata { { "X-Correlation-Id", _correlationContextAccessor.CorrelationContext.CorrelationId } };
return await _queryClient.GetListAsync(request, header);
如设置UpdateTraceIdentifier = true,也可直接获取HttpContext中TraceIdentifier的字段,两者值是一样的
_logger.LogInformation($"[{context.GetHttpContext().TraceIdentifier}]我是B");
最后,让我们看一下日志输出的效果:

附上GitHub中详细的使用文档:https://github.com/stevejgordon/CorrelationId/wiki
.NET Core集成CorrelationId实现全链路日志输出的更多相关文章
- 基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪
原文链接:基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪 一.日志系统 1.日志框架 在每个系统应用中,我们都会使用日志系统,主要是为了记录必要的信息和方便排 ...
- asp.net core 集成 log4net 日志框架
asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...
- Net Core集成Exceptionless分布式日志功能以及全局异常过滤
Net Core集成Exceptionless分布式日志功能以及全局异常过滤 相信很多朋友都看过我的上篇关于Exceptionless的简单入门教程[asp.Net Core免费开源分布式异常日志收集 ...
- .NET Core集成SkyWalking+SkyAPM-dotne实现分布式链路追踪
.NET Core集成SkyWalking+SkyAPM-dotnet实现分布式链路追踪 SkyWalking是一款APM(应用性能管理),其他的还有Cat.Zipkin.Pinpoint等. 随着微 ...
- .NET Core集成Seq+Serilog实现日志中心
.NET Core集成Seq+Serilog实现日志中心 一,下载安装Seq https://datalust.co/download/all,版本很多,大家随便挑,开发版个人免费,商业版多账号需要收 ...
- 【HMS Core 6.0全球上线】Network Kit全链路网络加速技术,应用无惧网络拥塞
HMS Core 6.0已于7月15日全球上线,本次版本向广大开发者开放了众多全新能力与技术.其中HMS Core Network Kit开放了全链路网络加速技术,助力开发者为用户提供低时延的畅快网络 ...
- Go微服务全链路跟踪详解
在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪. 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链. 该ID称为Correlati ...
- 全链路跟踪skywalking简介
该文章主要包括以下内容: skywalking的简介 skywalking的使用,支持多种调用中间件(httpclent,springmvc,dubbo,mysql等等) skywalking的tra ...
- .Net Core微服务入门全纪录(完结)——Ocelot与Swagger
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(八)--Docker Compose与容器网络]完成了docker-compose.y ...
随机推荐
- Single Depth peeling 顺序无关渲染(OIT)
什么是顺序无关渲染 在3D渲染中,物体的渲染是按一定的顺序渲染的,这也就可能导致半透明的物体先于不透明的物体渲染,结果就是可能出现半透明物体后的物体由于深度遮挡而没有渲染出来.对于这种情况通常会先渲染 ...
- python-网络安全编程第十天(web目录扫描&&fake_useragent模块&&optionParser模块)
前言 昨天的内容没有完成今天花了点时间继续完成了 感觉自己的学习效率太低了!想办法提高学习效率吧 嗯 ,再制定下今天的目标 开始健身. python fake_useragent模块 1.UserAg ...
- cProfile分析程序性能
Python标准库中提供了三种用来分析程序性能的模块,分别是cProfile, profile和hotshot,另外还有一个辅助模块stats.这些模块提供了对Python程序的确定性分析功能,同时也 ...
- CorelDRAW常用工具:羽化工具
一.什么是羽化 羽化是针对素材中选区的一项编辑处理.有些新手可能还不理解"羽化"的具体效果,其实羽化就是达到素材选区内外衔接部分虚化,起到渐变的作用从而达到自然衔接效果的操作. C ...
- CorelDRAW中如何精确移动对象
图形的变换操作包括改变图形的位置.大小.比例,旋转图形.镜像图形和倾斜图形,是在绘图编辑时经常使用的操作.使用"选择工具"选择对象之后,在对象上按下鼠标左键并拖动,即可任意移动对象 ...
- 为什么企业需要CRM系统?CRM的作用及其重要性分析
客户管理系统(CRM)是企业核心应用软件之一,对于提高企业业绩起着至关重要的作用,现在很多企业都在客户发展方面投入大量的资金,以求获得更好的回报. 关于CRM CRM是一个客户数据中心,在CRM中,你 ...
- 从Guarded Block来看Java中的wait和notify方法
目录 预备知识 概览 线程同步 wait()方法 wait() wait(long timeout) wait(long timeout, int nanos) notify() & noti ...
- Java基础教程——数组
数组 Java数组:用于存储同一种数据类型的多个数据. Java数组本身是一种数据类型--引用类型. 类(String.Scanner等大写字母开头的类型)也属于引用类型,int.double等基本类 ...
- redis 一致性分析
转载: https://blog.csdn.net/qq32933432/article/details/108690254
- Python中倒转输入序列元素顺序的reversed函数
reversed函数将输入的序列的元素倒转后存储到一个类型为"reversed"可迭代对象,不能直接访问,可以转换为其他对象如列表或通过for循环方法访问. 注意:这里是倒转不是倒 ...