.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实现全链路日志输出的更多相关文章

  1. 基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪

    原文链接:基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪 一.日志系统 1.日志框架 在每个系统应用中,我们都会使用日志系统,主要是为了记录必要的信息和方便排 ...

  2. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  3. Net Core集成Exceptionless分布式日志功能以及全局异常过滤

    Net Core集成Exceptionless分布式日志功能以及全局异常过滤 相信很多朋友都看过我的上篇关于Exceptionless的简单入门教程[asp.Net Core免费开源分布式异常日志收集 ...

  4. .NET Core集成SkyWalking+SkyAPM-dotne实现分布式链路追踪

    .NET Core集成SkyWalking+SkyAPM-dotnet实现分布式链路追踪 SkyWalking是一款APM(应用性能管理),其他的还有Cat.Zipkin.Pinpoint等. 随着微 ...

  5. .NET Core集成Seq+Serilog实现日志中心

    .NET Core集成Seq+Serilog实现日志中心 一,下载安装Seq https://datalust.co/download/all,版本很多,大家随便挑,开发版个人免费,商业版多账号需要收 ...

  6. 【HMS Core 6.0全球上线】Network Kit全链路网络加速技术,应用无惧网络拥塞

    HMS Core 6.0已于7月15日全球上线,本次版本向广大开发者开放了众多全新能力与技术.其中HMS Core Network Kit开放了全链路网络加速技术,助力开发者为用户提供低时延的畅快网络 ...

  7. Go微服务全链路跟踪详解

    在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪. 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链. 该ID称为Correlati ...

  8. 全链路跟踪skywalking简介

    该文章主要包括以下内容: skywalking的简介 skywalking的使用,支持多种调用中间件(httpclent,springmvc,dubbo,mysql等等) skywalking的tra ...

  9. .Net Core微服务入门全纪录(完结)——Ocelot与Swagger

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(八)--Docker Compose与容器网络]完成了docker-compose.y ...

随机推荐

  1. zookeeper和kafka的leader和follower

    来源于:https://www.cnblogs.com/aspirant/p/9179045.html 一.zookeeper 与kafka保持数据一致性的不同点: (1)zookeeper使用了ZA ...

  2. 宕机了,Redis数据丢了怎么办?

    持续原创输出,点击上方蓝字关注我 目录 前言 什么是AOF? 三种写回策略 日志文件太大怎么办? AOF重写会阻塞主线程吗? AOF的缺点 总结 什么是RDB? 给哪些数据做快照? 快照时能够修改数据 ...

  3. 写的太细了!Spring MVC拦截器的应用,建议收藏再看!

    Spring MVC拦截器 拦截器是Spring MVC中强大的控件,它可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作. 拦截器概述 对于任何优秀的MVC框架, ...

  4. web自动化 模拟鼠标、键盘操作

    一.鼠标操作 1.1鼠标的悬停操作,move_to_element from selenium import webdriver from selenium.webdriver.common.acti ...

  5. mysql5.5升级5.7(1)

    卸载旧版本mysql 当然要记得备份数据库数据啦 1.查看需要卸载的部分: rpm -qa |grep -i mysql 2.开始卸载: yum remove mysql* 接下来是安装新版mysql ...

  6. 流量控制--6.Classful Queuing Disciplines (qdiscs)

    Classful Queuing Disciplines 可以使用classful qdisc的代理来解锁Linux流量控制的灵活性和控制力.classful qdisc可以附加过滤器,允许将报文重定 ...

  7. eclispe中打点不会提示的解决方法,以及自动补全

    Eclipse中打点无提示的解决办法 建了个JAVA工程,然后发现输入代码后,在输入.后面不会弹出来我所要的函数.  alt+/      提示No Default Proposals 自己找了半天, ...

  8. 九. Vuex详解

    1. 理解Vuex 1.1 Vuex功能 官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用 集中式存储 管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方 ...

  9. moviepy音视频开发:audio_normalize调整剪辑音量大小到正常

    ☞ ░ 前往老猿Python博文目录 ░ 概述 audio_normalize函数用于将一个剪辑的音量大小调整到正常,调整的思路就是将剪辑中音频帧数据的最大值取出来,当其值小于1时,表示剪辑的音量偏小 ...

  10. PyQt(Python+Qt)学习随笔:树型部件QTreeWidget的itemAbove、itemBelow方法作用探究

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTreeWidget的方法中,对于itemBelow.itemAbove方法,官网文档介绍非常简 ...