.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 ...
随机推荐
- zookeeper和kafka的leader和follower
来源于:https://www.cnblogs.com/aspirant/p/9179045.html 一.zookeeper 与kafka保持数据一致性的不同点: (1)zookeeper使用了ZA ...
- 宕机了,Redis数据丢了怎么办?
持续原创输出,点击上方蓝字关注我 目录 前言 什么是AOF? 三种写回策略 日志文件太大怎么办? AOF重写会阻塞主线程吗? AOF的缺点 总结 什么是RDB? 给哪些数据做快照? 快照时能够修改数据 ...
- 写的太细了!Spring MVC拦截器的应用,建议收藏再看!
Spring MVC拦截器 拦截器是Spring MVC中强大的控件,它可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作. 拦截器概述 对于任何优秀的MVC框架, ...
- web自动化 模拟鼠标、键盘操作
一.鼠标操作 1.1鼠标的悬停操作,move_to_element from selenium import webdriver from selenium.webdriver.common.acti ...
- mysql5.5升级5.7(1)
卸载旧版本mysql 当然要记得备份数据库数据啦 1.查看需要卸载的部分: rpm -qa |grep -i mysql 2.开始卸载: yum remove mysql* 接下来是安装新版mysql ...
- 流量控制--6.Classful Queuing Disciplines (qdiscs)
Classful Queuing Disciplines 可以使用classful qdisc的代理来解锁Linux流量控制的灵活性和控制力.classful qdisc可以附加过滤器,允许将报文重定 ...
- eclispe中打点不会提示的解决方法,以及自动补全
Eclipse中打点无提示的解决办法 建了个JAVA工程,然后发现输入代码后,在输入.后面不会弹出来我所要的函数. alt+/ 提示No Default Proposals 自己找了半天, ...
- 九. Vuex详解
1. 理解Vuex 1.1 Vuex功能 官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用 集中式存储 管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方 ...
- moviepy音视频开发:audio_normalize调整剪辑音量大小到正常
☞ ░ 前往老猿Python博文目录 ░ 概述 audio_normalize函数用于将一个剪辑的音量大小调整到正常,调整的思路就是将剪辑中音频帧数据的最大值取出来,当其值小于1时,表示剪辑的音量偏小 ...
- PyQt(Python+Qt)学习随笔:树型部件QTreeWidget的itemAbove、itemBelow方法作用探究
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTreeWidget的方法中,对于itemBelow.itemAbove方法,官网文档介绍非常简 ...