资讯专栏INFORMATION COLUMN

应用SpringAOP及Tlog工具完成日志链路追踪、收集、持久化

KaltZK / 2777人阅读

摘要:经过一番考察吧,对于链路追踪,我们选用了这个日志追踪工具。日志收集使用注解主要对出入参及异常信心进行收集处理。另外对进行简单封装,提供等方法,这些方法输入的日志也进行收集存储。

❌一、痛点

目前我司各系统的日志管理比较原始,使用logback打日志到log文件,虽然有服务管理平台,但记录的日志也仅仅是前置机调用后台系统的出入参,当遇到问题时查日志较为麻烦。

登录VPN-打开服务器-找到日志目录-打开日志文件-搜索

而这个过程也仅仅是在一台服务器上的操作,一般需要看前置机、后台系统甚至服务管理平台。

当用户较少时,通过先后顺序等其他标志还能查到,但当调用量稍多后就很难判断哪个日志是哪个操作发出的。

另外,我司产品前台面向用户,后台与多家公司产品有大量互相调用,当用户遇到问题首先投诉的是我司产品,如在日志中找不到问题点,背锅的就是我们。

✔️二、解决思路

任务有2个

  1. 链路追踪,一次调用的日志,无论跨多少平台都能串起来;
  2. 日志存库,这主要是为了开发一个日志查询功能,提供给运维人员。

2.1、Tlog

经过一番考察吧,对于链路追踪,我们选用了Tlog这个日志追踪工具。主页链接:yomahub.com/tlog/

主要考虑点是:

  • 最基础的功能:日志打标签,并且支持标签模板的自定义,可通过TLogContext.getTraceId()和TLogContext.putTraceId(id)获取和设置id;
  • 业务代码无侵入

不过对HttpClient是侵入式的,需要加拦截器

这个拦截器的实现还是颇为简单

public class TLogHttpClientInterceptor implements HttpRequestInterceptor {        private static final Logger log = LoggerFactory.getLogger(TLogHttpClientInterceptor.class);        @Override    public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {        Args.notNull(request, "HTTP request");        String traceId = TLogContext.getTraceId();        if(StringUtils.isNotBlank(traceId)) {            String appName = TLogSpringAware.getProperty("spring.application.name");            request.addHeader(TLogConstants.TLOG_TRACE_KEY, traceId);            request.addHeader(TLogConstants.TLOG_SPANID_KEY, SpanIdGenerator.generateNextSpanId());            request.addHeader(TLogConstants.PRE_IVK_APP_KEY, appName);            request.addHeader(TLogConstants.PRE_IVK_APP_HOST, LocalhostUtil.getHostName());            request.addHeader(TLogConstants.PRE_IP_KEY, LocalhostUtil.getHostIp());        } else {            log.debug("[TLOG]鏈湴threadLocal鍙橀噺娌℃湁姝g‘浼犻�抰raceId,鏈璋冪敤涓嶄紶閫抰raceId");        }    }}

 

不过需要注意的点是,有一些方法使用了Hutool高版本提供的方法,注意项目中版本冲突的解决。

对Tlog的集成还有一个问题,公司使用的服务管理平台由其他部门开发管理,需要该部门协同解决,不过好在我们可以拿到源码????????

2.2、日志存储

日志存储自然不希望对当前业务有任何影响,考虑到系统并发量并不是很大,就采用线程池来调用日志系统存库。

2.3、日志收集

使用注解主要对出入参及异常信心进行收集处理。另外对logback进行简单封装,提供info()、error()等方法,这些方法输入的日志也进行收集、存储。 因业务特殊性,需要使用的系统都复用一套自定义注解、公共切面方法,并在切面中完成特殊业务的处理。

颇多细节就不多写了,本文主要就是介绍整体思路,对于调用量说多不多的系统还可以。

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124529.html

相关文章

  • 他山之石——运维平台哪家强?

    摘要:当云平台出现网络故障系统故障等问题,这对云租户用户有时甚至是致命的,所以不少是由高级别开发人员转型而来。目前国内各大云厂商也基本都提供了应用运维平台,包括腾讯蓝鲸阿里华为等。 DevOps 全链路 下图是我们熟知的软件研发环节,在迭代频率高的研发组织里,一天可能要经历多次如下循环。对于用户群体庞大或者正在经历大幅业务扩张的企业研发组织,除了重点关注应用的快速上线之外,如何保障应用的高可...

    mylxsw 评论0 收藏0
  • 微服务调用链追踪中心搭建

    摘要:一个客户端请求从发出到被响应经历了哪些组件哪些微服务请求总时长每个组件所花时长等信息我们有必要了解和收集,以帮助我们定位性能瓶颈进行性能调优,因此监控整个微服务架构的调用链十分有必要,本文将阐述如何使用搭建微服务调用链追踪中心。 showImg(https://segmentfault.com/img/remote/1460000014553707); 概述 一个完整的微服务系统包含...

    Pines_Cheng 评论0 收藏0
  • Java学习路线

    摘要:学习路线编程基础语言语言基础数据类型面向对象接口容器异常泛型反射注解流集合类加载机制字节码执行机制 Java学习路线 Java编程基础 Java语言 Java语言基...

    不知名网友 评论0 收藏0
  • 猫头鹰的深夜翻译:使用SpringBoot和AspectJ实现AOP

    摘要:我们会写切面来拦截对这些业务类和类的调用。切面定义何时拦截一个方法以及做什么和在一起成为切面连接点当代码开始执行,并且切点的条件满足时,通知被调用。 前言 这篇文章会帮助你使用Spring Boot Starter AOP实现AOP。我们会使用AspectJ实现四个不同的通知(advice),并且新建一个自定义的注解来追踪方法的执行时间。 你将会了解 什么是交叉分割关注点(cross...

    meislzhua 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<