日志链路跟踪

实现技术

slf4j+logback+tlog+logstash
 
 
maven配置
<dependency>
    <groupId>com.yomahub</groupId>
    <artifactId>tlog-all-spring-boot-starter</artifactId>
    <version>1.5.1</version>
</dependency>

<dependency>
    <groupId>com.yomahub</groupId>
    <artifactId>tlog-logstash-logback</artifactId>
    <version>1.5.1</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.9</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.9</version>
</dependency>

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-to-slf4j</artifactId>
    <version>2.24.2</version>
</dependency>
 

两中输出格式(根据项目实际情况选择)

 

完整xml(logback-spring.xml)

      
<?xml version="1.0" encoding="UTF-8" ?>
<!--日志级别 OFF > FATA > ERROR > WARN > INFO > DEBUG > TRACE > ALL-->
<configuration debug="false" scan="true" scanPeriod="30 seconds">

    <!-- 定义日志文件 名称 -->
    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
    <property name="LOG_HOME" value="/data/applog/${APP_NAME}"/>

    <contextListener class="com.yomahub.tlog.core.enhance.logback.TLogLogbackTTLMdcListener"/>
    <conversionRule conversionWord="xEx" converterClass="cn.xs.qishi.common.log.XSThrowableProxyConverter"/>

    <!-- 输出的控制台格式的Appender -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${APP_NAME}] %X{tl} %-5level %logger{35} - %msg%xEx%n</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 输出的logstash JSON格式的Appender -->
    <appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.json</fileNamePattern>
            <MaxHistory>180</MaxHistory>
            <maxFileSize>1024MB</maxFileSize>
        </rollingPolicy>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <provider class="com.yomahub.tlog.logstash.logback.TLogLogstashLogbackProvider"/>
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>
                    <pattern>
                        {"message": {"datetime": "%d{yyyy-MM-dd HH:mm:ss.SSS}", "severity": "%level", "service": "${APP_NAME:-}", "thread": "%thread", "class": "%logger{35}", "step": "%X{tl}", "rest": "%message%xEx" } }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

    <!-- 输出的普通格式的Appender -->
    <!--    <appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
    <!--        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
    <!--            <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.json</FileNamePattern>-->
    <!--            <MaxHistory>180</MaxHistory>-->
    <!--            <maxFileSize>1024MB</maxFileSize>-->
    <!--        </rollingPolicy>-->
    <!--        <encoder charset="UTF-8" class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">-->
    <!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${APP_NAME}] %X{tl} %-5level %logger{35} - %msg%xEx%n</pattern>-->
    <!--        </encoder>-->
    <!--    </appender>-->

    <!-- 如果你还想捕获ERROR级别的日志,可以单独再定义或者调整上面的level属性为ERROR -->
    <logger name="com.alibaba.dubbo" level="ERROR" additivity="false">
        <appender-ref ref="logFile"/>
        <appender-ref ref="console"/>
    </logger>
    <logger name="org.apache.dubbo" level="ERROR" additivity="false">
        <appender-ref ref="logFile"/>
        <appender-ref ref="console"/>
    </logger>
    <logger name="com.alibaba.nacos" level="ERROR" additivity="false">
        <appender-ref ref="logFile"/>
        <appender-ref ref="console"/>
    </logger>
    <logger name="org.springframework.cloud.alibaba.nacos" level="ERROR" additivity="false">
        <appender-ref ref="logFile"/>
        <appender-ref ref="console"/>
    </logger>

    <logger name="com.xxl.job" level="ERROR" additivity="false">
        <appender-ref ref="logFile"/>
        <appender-ref ref="console"/>
    </logger>
    <logger name="com.xxl.job.core" level="ERROR" additivity="false">
        <appender-ref ref="logFile"/>
        <appender-ref ref="console"/>
    </logger>

    <!-- 异步输出log  -->
    <appender name="asyncLogFile" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>2048</queueSize>
        <includeCallerData>true</includeCallerData>
        <appender-ref ref="logFile"/>
    </appender>

    <appender name="asyncConsole" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>2048</queueSize>
        <includeCallerData>true</includeCallerData>
        <appender-ref ref="console"/>
    </appender>


    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="asyncConsole"/>
        <appender-ref ref="asyncLogFile"/>
    </root>
</configuration>

    

 

XSThrowableProxyConverter 为定义类 (将异常信息打印成1行,结合Elastic使用)
package cn.xs.qishi.common.log;

import ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter;
import ch.qos.logback.classic.spi.IThrowableProxy;

/**
 * logback logstash 打印堆栈信息
 */
public class XSThrowableProxyConverter extends ExtendedThrowableProxyConverter {

    @Override
    protected String throwableProxyToString(IThrowableProxy tp) {
        String originStack = super.throwableProxyToString(tp);
        if(originStack == null) {
            return originStack;
        }
        
        StringBuffer sb = new StringBuffer();
        sb.append(" exception \\n");
        String[] lines = originStack.split("\r\n|\n");
        for (String line : lines) {
           sb.append(line).append("\\n");
        }
        return sb.toString();
    }

}

 

 

 

 

 

 

 

 

 

 

posted @ 2025-02-05 14:25  爱,诗意永存  阅读(16)  评论(0)    收藏  举报