Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】

通过之前的入门示例,我们已经为trace-1trace-2引入了Spring Cloud Sleuth的基础模块spring-cloud-starter-sleuth,实现了为各微服务的日志信息中添加跟踪信息的功能。但是,由于日志文件都离散的存储在各个服务实例的文件系统之上,仅仅通过查看日志文件来分析我们的请求链路依然是一件相当麻烦的差事,所以我们还需要一些工具来帮助我们集中的收集、存储和搜索这些跟踪信息。引入基于日志的分析系统是一个不错的选择,比如:ELK平台,它可以轻松的帮助我们来收集和存储这些跟踪日志,同时在需要的时候我们也可以根据Trace ID来轻松地搜索出对应请求链路相关的明细日志。

ELK平台主要有由ElasticSearch、Logstash和Kiabana三个开源免费工具组成:

  • Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
  • Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用。
  • Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

Spring Cloud Sleuth在与ELK平台整合使用时,实际上我们只要实现与负责日志收集的Logstash完成数据对接即可,所以我们需要为Logstash准备json格式的日志输出。由于Spring Boot应用默认使用了logback来记录日志,而Logstash自身也有对logback日志工具的支持工具,所以我们可以直接通过在logback的配置中增加对logstash的appender,就能非常方便的将日志转换成以json的格式存储和输出了。

下面我们来详细介绍一下在快速入门示例的基础上,如何实现面向Logstash的日志输出配置:

  • pom.xml依赖中引入logstash-logback-encoder依赖,具体如下:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.6</version>
</dependency>
  • 在工程/resource目录下创建bootstrap.properties配置文件,将spring.application.name=trace-1配置移动到该文件中去。由于logback-spring.xml的加载在application.properties之前,所以之前的配置logback-spring.xml无法获取到spring.application.name属性,因此这里将该属性移动到最先加载的bootstrap.properties配置文件中。

  • 在工程/resource目录下创建logback配置文件logback-spring.xml,具体内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<!-- 日志在工程中的输出位置 -->
<property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}"/>
<!-- 控制台的日志输出样式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

<!-- 控制台Appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>

<!-- 为logstash输出的json格式的Appender -->
<appender name="logstash" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"severity": "%level",
"service": "${springAppName:-}",
"trace": "%X{X-B3-TraceId:-}",
"span": "%X{X-B3-SpanId:-}",
"exportable": "%X{X-Span-Export:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>

<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="logstash"/>
</root>
</configuration>

对logstash支持主要通过名为logstash的appender实现,内容并不复杂,主要是对日志信息的格式化处理,上面为了方便调试查看我们先将json日志输出到文件中。

完成上面的改造之后,我们再将快速入门的示例运行起来,并发起对trace-1的接口访问。此时我们可以在trace-1trace-2的工程目录下发现有一个build目录,下面分别创建了以各自应用名称命名的json文件,该文件就是在logback-spring.xml中配置的名为logstash的appender输出的日志文件,其中记录了类似下面格式的json日志:

{"@timestamp":"2016-12-04T06:57:58.970+00:00","severity":"INFO","service":"trace-1","trace":"589ee5f7b860132f","span":"a9e891273affb7fc","exportable":"false","pid":"19756","thread":"http-nio-9101-exec-1","class":"c.d.TraceApplication$$EnhancerBySpringCGLIB$$a9604da6","rest":"===<call trace-1>==="}
{"@timestamp":"2016-12-04T06:57:59.061+00:00","severity":"INFO","service":"trace-1","trace":"589ee5f7b860132f","span":"2df8511ddf3d79a2","exportable":"false","pid":"19756","thread":"http-nio-9101-exec-1","class":"o.s.c.a.AnnotationConfigApplicationContext","rest":"Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@64951f38: startup date [Sun Dec 04 14:57:59 CST 2016]; parent: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4b8c8f15"}

我们除了可以通过上面的方式生成json文件之外,也可以使用LogstashTcpSocketAppender将日志内容直接通过Tcp Socket输出到logstash服务端,比如:

<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:9250</destination>
...
</appender>

本文完整示例:

读者可以根据喜好选择下面的两个仓库中查看trace-1trace-2两个项目:

  • Github:https://github.com/dyc87112/SpringCloud-Learning/
  • Gitee:https://gitee.com/didispace/SpringCloud-Learning/

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!

本文内容部分节选自我的《Spring Cloud微服务实战》,但对依赖的Spring Boot和Spring Cloud版本做了升级。


money.jpg

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

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

相关文章

会议交流 | 第十六届全国知识图谱与语义计算大会(8月24-27日)

点击阅读原文&#xff0c;进入 CCKS2022 官方网站。OpenKGOpenKG&#xff08;中文开放知识图谱&#xff09;旨在推动以中文为核心的知识图谱数据的开放、互联及众包&#xff0c;并促进知识图谱算法、工具及平台的开源开放。

1000层的Transformer,诞生了!

卖萌屋今日学术精选大家好&#xff0c;我是卖萌酱。今天下午卖萌屋作者群里一位MILA实验室的大佬在临睡前&#xff08;蒙特利尔时间凌晨0点半&#xff09;甩出来一篇论文&#xff1a;大佬表示太困了&#xff0c;肝不动了&#xff0c;于是卖萌酱左手抄起一罐咖啡&#xff0c;右手…

LeetCode 1305. 两棵二叉搜索树中的所有元素(二叉树迭代器)

1. 题目 给你 root1 和 root2 这两棵二叉搜索树。 请你返回一个列表&#xff0c;其中包含 两棵树 中的所有整数并按 升序 排序。. 提示&#xff1a; 每棵树最多有 5000 个节点。 每个节点的值在 [-105, 105] 之间。 2. 二叉树迭代器 按照中序迭代&#xff0c;比较两个迭代…

Spring Cloud构建微服务架构:分布式服务跟踪(跟踪原理)【Dalston版】

通过上一篇《分布式服务跟踪&#xff08;入门&#xff09;》的例子&#xff0c;我们已经通过Spring Cloud Sleuth往微服务应用中添加了实现分布式跟踪具备的基本要素。下面通过本文来详细说说实现分布式服务跟踪的一些要点。 分布式系统中的服务跟踪在理论上并不复杂&#xff0…

竞赛报名 | “未来杯”第二届知识图谱锦标赛火热报名中,最高奖金32000元!...

转载公众号 | AI Timer继2021年“未来杯”系列赛事之AI学术联赛暨首届人工智能知识图谱锦标赛成功举办后&#xff0c;中软国际教育科技集团旗下SteerTech科技创新开源生态平台联手AI TIME&#xff0c;再一次迎来人工智能知识图谱应用在众多领域落地的探索旅程。一、组织机构【…

我在鹅厂,拿到满星绩效!

文 | 山竹小鹅背绩效&#xff1f;就算SP以上也背绩效&#xff1f;互联网寒冬&#xff1f;内卷太严重&#xff1f;卷不动&#xff1f;资本家吃相太难看&#xff1f;……听了太多消极言论&#xff0c;有些是陈述事实&#xff0c;也有很多是贩卖焦虑。吐槽能变得更好吗&#xff1f…

2019年学习总结

总结回顾自己学习的过程&#xff0c;看看自己的学习成果&#xff0c;激励自己在2020继续努力。 2019.3 - 2019.9 学习了王争的《数据结构和算法之美》&#xff0c;github 代码地址 统计了 2018.2 至 2019.12 的cpp代码量&#xff1a;41,721‬行 find . -name "*.cpp&qu…

Spring Cloud构建微服务架构:消息驱动的微服务(消费分区)【Dalston版】

通过上一篇《消息驱动的微服务&#xff08;消费组&#xff09;》的学习&#xff0c;我们已经能够在多实例环境下&#xff0c;保证同一消息只被一个消费者实例进行接收和处理。但是&#xff0c;对于一些特殊场景&#xff0c;除了要保证单一实例消费之外&#xff0c;还希望那些具…

图谱实战 | 知识图谱在供应链和运营绩效提升领域的应用

转载公众号 | DataFunSummit分享嘉宾&#xff1a;高欢 &#xff08;前&#xff09;博世中国编辑整理&#xff1a;卢鹏澳 桂林电子科技大学出品平台&#xff1a;DataFunTalk导读&#xff1a;公司内部尝试运用AI技术落地了几款基于知识图谱的产品&#xff0c;本文将从实践和应用角…

薪资不逊NLP算法岗,边缘AI火了!

众所周知&#xff0c;深度神经网络模型被广泛应用在图像分类、物体检测&#xff0c;目标跟踪等计算机视觉任务中&#xff0c;并取得了巨大成功。随着不同场景的需求变得更加多样&#xff0c;越来越多的IoT设备和场景需要与数据采集点以最接近的低时延来进行决策和操作&#xff…

LeetCode 735. 行星碰撞(栈)

1. 题目 给定一个整数数组 asteroids&#xff0c;表示在同一行的行星。 对于数组中的每一个元素&#xff0c;其绝对值表示行星的大小&#xff0c;正负表示行星的移动方向&#xff08;正表示向右移动&#xff0c;负表示向左移动&#xff09;。每一颗行星以相同的速度移动。 找…

Spring Cloud构建微服务架构:消息驱动的微服务(消费组)【Dalston版】

通过之前的《消息驱动的微服务&#xff08;入门&#xff09;》一文&#xff0c;相信很多朋友已经对Spring Cloud Stream有了一个初步的认识。但是&#xff0c;对于《消息驱动的微服务&#xff08;核心概念&#xff09;》一文中提到的一些核心概念可能还有些迷糊&#xff0c;下面…

论文浅尝 | C3KG:中文常识对话知识图谱

笔记整理&#xff1a;张廉臣&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理。Citation: Li, D., Li, Y., Zhang, J., Li, K., Wei, C., Cui, J., & Wang, B. (2022). C3KG: A Chinese Commonsense Conversation Knowledge Graph. arXiv preprint arXiv:2204.…

Spring Cloud构建微服务架构:消息驱动的微服务(核心概念)【Dalston版】

通过《Spring Cloud构建微服务架构&#xff1a;消息驱动的微服务&#xff08;入门&#xff09;》一文&#xff0c;相信大家对Spring Cloud Stream的工作模式已经有了一些基础概念&#xff0c;比如&#xff1a;输入、输出通道的绑定&#xff0c;通道消息事件的监听等。下面在本文…

大模型时代,我们真的不再需要分词了吗?

文 | 付奶茶编 | 小轶分词是NLP的基础任务&#xff0c;将句子、段落分解为字词单位&#xff0c;方便后续的处理的分析。不知道NLPer有没有思考过这个问题:我们在各项研究工作中想要建模的文本单位究竟是什么?What are the units of text that we want to model?在这篇论文中,…

LeetCode 1190. 反转每对括号间的子串(栈)

1. 题目 给出一个字符串 s&#xff08;仅含有小写英文字母和括号&#xff09;。 请你按照从括号内到外的顺序&#xff0c;逐层反转每对匹配括号中的字符串&#xff0c;并返回最终的结果。 注意&#xff0c;您的结果中 不应 包含任何括号。 示例 1&#xff1a; 输入&#xf…

论文浅尝 | 探索用于归纳型知识图谱补全的关系语义

笔记整理&#xff1a;徐雅静&#xff0c;浙江大学在读硕士&#xff0c;研究方向为知识图谱的表示学习&#xff0c;零样本学习。KGC指的是在不完整的KG中推理出缺失的实体。以前的多数工作仅仅考虑到直推式场景&#xff08;实体都存在KG中&#xff09;&#xff0c;不能有效地解决…

关于深度学习,我们写了一本1400页的全栈手册

不知不觉写文章已经四年了。最开始是一个人&#xff0c;后来恰了恰饭&#xff0c;就招揽了很多比小夕厉害的小伙伴一起写。不知不觉已经积累了300多篇了。。三年以来&#xff0c;我跟小伙伴们原创的300篇深度学习与NLP领域的入门资料、子方向综述、2018~2022学术前沿解读、工业…

LeetCode 1019. 链表中的下一个更大节点(单调栈)

1. 题目 给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为&#xff1a;node_1, node_2, node_3, … 。 每个节点都可能有下一个更大值&#xff08;next larger value&#xff09;&#xff1a;对于 node_i&#xff0c;如果其 next_larger(node_i) 是 node…

Spring Cloud Hystrix的请求合并

通常微服务架构中的依赖通过远程调用实现&#xff0c;而远程调用中最常见的问题就是通信消耗与连接数占用。在高并发的情况之下&#xff0c;因通信次数的增加&#xff0c;总的通信时间消耗将会变的不那么理想。同时&#xff0c;因为对依赖服务的线程池资源有限&#xff0c;将出…