zoukankan      html  css  js  c++  java
  • MDC实现traceId日志追踪

    分布式系统中,最棘手的问题往往是日志跟踪, 多台机器多个server,调用链的关系、连续性显得格外重要。我们需要一个唯一标识来记录每条日志的输出,并希望其传递下去。
    一个很简单的方式就是集中在日志中。

    package com.log;
    
    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.annotation.Aspect;
    import org.slf4j.MDC;
    
    /**
     * 统一日志追踪
     */
    
    @Slf4j
    @Component
    @Aspect
    public class TraceIdHandler {
    
        private static final String TRACE_ID = "traceId";
    
        @Before(value = "execution(* com..*.*(..))")
        public void excuteBefore() {
            if (StringUtils.isBlank(MDC.get(TRACE_ID))) {
                String traceId = IdGenerator.get() + "-" + ((int) ((Math.random() * 9 + 1) * 100000));
                MDC.put(TRACE_ID, traceId);
            }
        }
    }

    关键是--> [%X{traceId}]
    <RollingRandomAccessFile name="running-log"
    fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
    <PatternLayout
    pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line][%X{traceId} %X{uid} %X{fundAccount}] - %msg%n" />
    <Policies>
    <TimeBasedTriggeringPolicy />
    <SizeBasedTriggeringPolicy size="100 MB" />
    </Policies>
    <DefaultRolloverStrategy max="20" />
    </RollingRandomAccessFile>

    需要添加依赖slf4j【slf4j的作用参考:https://www.cnblogs.com/xrq730/p/8619156.html】:

    <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j-impl</artifactId>
                <version>2.6.2</version>
                <optional>true</optional>
            </dependency>
     
  • 相关阅读:
    A/B-test
    LDA概率主题模型
    减肥经验帖
    wide and deep
    利用责任链模式设计一个拦截器
    分享几个 SpringBoot 实用的小技巧
    「造个轮子」——cicada 设计一个配置模块
    「造个轮子」——cicada 源码分析
    「造个轮子」——cicada(轻量级 WEB 框架)
    强如 Disruptor 也发生内存溢出?
  • 原文地址:https://www.cnblogs.com/bestzhang/p/13099275.html
Copyright © 2011-2022 走看看