1 背景
在电商系统中,我们现在都部署的是一套微服务的系统,每个服务会有多个节点,服务之间会有相互之间的调用,如果我们把每个日志的服务输出到自己的项目里面,根本没有办法进行整体的分析。再加上微服务负载均衡,日志在哪个节点上输出都无法定位,这给我们排查问题带来了很多的难度,因此一套将分散日志集中收集的系统,显得异常重要了。今天我们就讲下日志收集系统的架构和设计。
2 系统架构
- FileBeat是一个文本日志收集器,作用是可以收集本地的日志文件后传输给各个平台。
- Logstash的作用就是接收来自收集器的数据后,对数据进行过滤,然后将数据发送给es。
- es是整个ELK的核心,它接收了Logstash发送过来的进行存储,并建立索引。可供kibana进行搜索获取数据。因此es为我们解决了大量的日志存储问题和搜索日志的问题。大大的简化我们对日志获取,日志搜索的工作。
- kibana是一个web项目,部署后可通过浏览器进行访问,而这个项目提供了大量的操作和可视化解析功能,让你可以随意的组合,形成自己的一套可视化界面。
没错,我们使用的就是非常成熟的ELK的方案来搭建我们自己的日志收集系统,这样就可以把分散的日志都集中收集在一起了。
但是我们仔细想是不是还缺一些东西呢,就算分散的日志在一起了,我们怎么看日志的调用顺序呢?这个就是我们接下来要讲的日志追踪了。
3 日志追踪
3.1 skywalking
首先要说一下,skywalking是一款国产开源的框架,是一款应用系统性能监测的工具,专为微服务,云原生和容器架构而设计的。可以提供链路追踪和可视化平台,是非常不错的。
可以通过agent 探针的方式接入,对代码无耦合,使用也非常的方便,但是总体感觉有点笨重(个人意见)。
skywalking的日志追踪方案已经非常的成熟,大家感兴趣的可以自行去研究一下。引入日志收集的jar包后,可以接入到mysql,es等,系统的进行日志的分析。
3.2 MDC方案
今天我来说下 springboot+MDC的日志追踪方案,这个方案代码的侵入性比较强,使用起来还是很轻量的。
MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。这一点跟ThreadLocal 非常的相似,每个线程维护一个MDC的map,用完就销毁。
在拦截器中进行添加
在日志中添加格式
这样就直接可以使用了
4 总结
日志收集和日志跟踪的方案目前都很成熟了,我们只需要跟我我们自己的具体业务进行搭建和分析就可以了。当然还有其他的方案,欢迎大家留言探讨,点赞关注哦!