日志链路跟踪
实现技术
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(); } }

浙公网安备 33010602011771号