Sleuth+logback 设置traceid 及自定义信息方式
更新时间:2021年7月26日 15:00 点击:2034
Sleuth+logback 设置traceid及自定义信息
背景:
分布式系统中,如何快速定位某个用户的请求日志?
使用Sleuth生成的traceid可以跟踪某个请求,但是很多时候我们需要知道traceid 与某个用户的映射关系,方便定位某个用户的日志
方案:
@Component @Order(TraceWebServletAutoConfiguration.TRACING_FILTER_ORDER + 1) public class CustomHttpSpanExtractor extends GenericFilterBean { private final Tracer tracer; CustomHttpSpanExtractor(Tracer tracer) { this.tracer = tracer; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { Span currentSpan = this.tracer.currentSpan(); if (currentSpan == null) { chain.doFilter(request, response); return; } HttpServletRequest httpRequest = (HttpServletRequest) request; try { // mdc(httpRequest,currentSpan.context().traceIdString()); MDC.put(MdcConstant.USER_ID,"userid-12345"); } catch (Exception e) { e.printStackTrace(); } try { chain.doFilter(request, response); } finally { MDC.clear();//must be,threadLocal } }}
logback 配置
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}[${applicationName},%X{X-B3-TraceId:-},%X{userId:-}] [%thread] %-5level %logger{50} - %msg%n</pattern>
logback简单使用,自定义key
1.logback的pom依赖
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.11</version> </dependency>
2.配置文件: logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="false" scanPeriod="5000" debug="false"> <springProperty scope="context" name="springAppName" source="spring.application.name" defaultValue="defaultAppName"/> <timestamp key="bySecond" datePattern="yyyy-MM-dd HH:mm:ss"/> <appender name="STASH-REDIS" class="com.jlb.yts.common.util.aop.RedisAppender"> <key>${springAppName:-}</key> <!-- <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ALL</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> --> <layout> <pattern> { "time": "%d{yyyy-MM-dd HH:mm:ss}", "application":"tech_cloud", "subapplication":"${springAppName:-}", "level": "%level", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "classname": "%logger{100}", "msg": "%message" } </pattern> </layout> </appender> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>5120</queueSize> <appender-ref ref="STASH-REDIS" /> </appender> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder charset="UTF-8"> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{40} - %msg%n</pattern> </encoder> </appender> <logger name="com.jlb.yts" additivity="true" level="ERROR"> <appender-ref ref="ASYNC" /> </logger> <logger name="com.jlb.yts" additivity="true" level="INFO"> <appender-ref ref="ASYNC" /> </logger> <!-- mongodb打印语句 --> <logger name="org.springframework.data.mongodb.core" level="DEBUG"/> <logger name="com.jlb.yts" additivity="true" level="DEBUG"> <appender-ref ref="ASYNC" /> </logger> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration>
3.自定义appender
package com.jlb.yts.common.util.aop; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.IThrowableProxy; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.classic.spi.StackTraceElementProxy; import ch.qos.logback.core.Layout; import ch.qos.logback.core.UnsynchronizedAppenderBase; import ch.qos.logback.core.filter.Filter; import com.jlb.yts.common.util.redis.RedisHandle; import com.jlb.yts.common.util.redis.ReidsConnect; import net.logstash.logback.layout.LoggingEventCompositeJsonLayout; import java.lang.reflect.Field; public class RedisAppender extends UnsynchronizedAppenderBase<ILoggingEvent> { public static String service; Layout<ILoggingEvent> layout; public void setFilter(Filter<ILoggingEvent> filter) { if(filter != null){ this.addFilter(filter); } } String key = null; public RedisAppender() { layout = new LoggingEventCompositeJsonLayout(); } private final static RedisHandle redisHandle = ReidsConnect.init("redis-log.properties","redis-log.properties"); @Override protected void append(ILoggingEvent event) { try { LoggingEvent loggingEvent = (LoggingEvent) event; String json = layout.doLayout(loggingEvent); redisHandle.addList(key,json); } catch (Exception e) { e.printStackTrace(); } finally { } } public String getKey() { return key; } public void setKey(String key) { String prefix = (System.getenv("APPLICATION_ENV") == null)?"dev":System.getenv("APPLICATION_ENV"); key = prefix + "-" + key; this.key = key; } public Layout<ILoggingEvent> getLayout() { return layout; } public void setLayout(Layout<ILoggingEvent> layout) { this.layout = layout; } }
4.代码实例
//注意导入的包都是slf4j的包 import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogbackTest { private static final Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class); public static void main(String[] args) { LOGGER.trace("logback的--trace日志--输出了"); LOGGER.debug("logback的--debug日志--输出了"); LOGGER.info("logback的--info日志--输出了"); LOGGER.warn("logback的--warn日志--输出了"); LOGGER.error("logback的--error日志--输出了"); } }
5.日志添加自定义KEY
import org.slf4j.MDC; MDC.put(key, value);
logback.xml 配置
"key":"%X{key:-}"
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。
相关文章
解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题
这篇文章主要介绍了解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-28Springboot+MDC+traceId日志中打印唯一traceId
本文主要介绍了Springboot+MDC+traceId日志中打印唯一traceId,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-17- 这篇文章主要介绍了springboot 使用logback启动报警报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-27
- 这篇文章主要介绍了logback 自定义Pattern模板教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-26
Sleuth+logback 设置traceid 及自定义信息方式
这篇文章主要介绍了Sleuth+logback 设置traceid 及自定义信息方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-26- 这篇文章主要介绍了Spring Boot日志技术logback原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-10
- 上一篇文章中老顾介绍了logback基本配置,了解了日志配置的基本方式.我们平时在系统开发时,开发环境与生产环境的日志配置会不一样;那今天老顾就跟大家介绍一下如何实现多环境配置,需要的朋友可以参考下...2021-06-16
- 这篇文章主要介绍了解决spring-boot使用logback的大坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-27
springboot使用Logback把日志输出到控制台或输出到文件
这篇文章给大家介绍springboot项目使用日志工具Logback把日志不仅输出到控制台,也可以输出到文件的操作方法,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2020-10-14- 这篇文章主要介绍了Java logback日志的使用详解,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...2021-03-20
- 这篇文章主要介绍了springboot项目配置logback日志系统的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-20
- 这篇文章主要介绍了Java日志框架之logback使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-01
- 这篇文章主要介绍了项目为什么引入log4j而不是logback代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-30
Spring Cloud 专题之Sleuth 服务跟踪实现方法
这篇文章主要介绍了Spring Cloud 专题之Sleuth 服务跟踪,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16- 这篇文章主要介绍了dubbo集成zipkin获取Traceid的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-26
- 这篇文章主要介绍了利用logback 设置不同包下的日志级别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-04
logback中显示mybatis查询日志文件并写入的方法示例
这篇文章主要为大家介绍了logback中显示mybatis查询日志文件并写入的方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...2022-03-23SpringBoot3集成SLF4J+logback进行日志记录的实现
本文主要介绍了SpringBoot3集成SLF4J+logback进行日志记录的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-01-23