上文《分布式链路日志plumelog教程(一)plumelog docker方式部署》我们演示了plumelog的服务端部署,这里我们需要把在java中集成这里的plumelog,让java的日志吞吐到plumelog中,并且在plumelog的dashboard中显示出来,这里也是为了演示,所以我们找到一个普通的项目进行演示,对应的项目地址:《演示项目下载》(这里主要是演示在现成的项目里面集成plumelog,所以对应的演示项目可以直接进行下载)。下面我们演示如何在现有的项目里面集成这里的plumelog。
一、添加依赖
这里一般我们都是springboot的项目,所以我们准备一个现成的springboot项目,在pom.xml中添加如下的依赖:
<dependency> <groupId>com.plumelog</groupId> <artifactId>plumelog-logback</artifactId> <version>3.5.3</version> </dependency>
二、添加/修改logback-spring.xml
这里如果现有项目里面有logback-spring.xml的话,则可以对照下面的文件进行修改,如果没有的话,则进行创建,如果使用其他的日志配置文件,建议对其进行迁移,统一放到这里的logback-spring.xml文件中来,这里我们的logback-spring.xml文件放在src/main/resources文件夹下,我这里演示的配置文件内容是:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 添加追踪码模式 -->
<property name="TRACE_PATTERN" value="[%X{traceId}] "/>
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} ${TRACE_PATTERN}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 环境配置 -->
<springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
<springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
<springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
<springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
<springProperty scope="context" name="plumelog.redisDb" source="plumelog.redisDb"/>
<springProperty scope="context" name="plumelog.env" source="spring.profiles.active"/>
<!--开发环境配置 -->
<springProfile name="dev">
<!--输出到控制台,开发环境使用 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到文件,开发环境使用 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/mybatis-demo-dev.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/mybatis-demo-dev.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TotalSizeCap>1GB</TotalSizeCap>
</rollingPolicy>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Plumelog日志输出,开发环境可选 -->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>${plumelog.appName}</appName>
<redisHost>${plumelog.redisHost}</redisHost>
<redisAuth>${plumelog.redisAuth}</redisAuth>
<redisDb>${plumelog.redisDb}</redisDb>
<env>${plumelog.env}</env>
<!-- 启用追踪码 -->
<expand>traceId</expand>
</appender>
<!-- 配置日志输出级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="file"/>
<appender-ref ref="plumelog"/>
</root>
</springProfile>
<!--测试环境配置 -->
<springProfile name="test">
<!--输出到控制台,测试环境使用 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到文件,测试环境使用 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/mybatis-demo-test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/mybatis-demo-test.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TotalSizeCap>1GB</TotalSizeCap>
</rollingPolicy>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Plumelog日志输出,测试环境 -->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>${plumelog.appName}</appName>
<redisHost>${plumelog.redisHost}</redisHost>
<redisAuth>${plumelog.redisAuth}</redisAuth>
<redisDb>${plumelog.redisDb}</redisDb>
<env>${plumelog.env}</env>
<!-- 启用追踪码 -->
<expand>traceId</expand>
</appender>
<!-- 配置日志输出级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="file"/>
<appender-ref ref="plumelog"/>
</root>
</springProfile>
<!--生产环境配置 -->
<springProfile name="prod">
<!-- 输出到文件,生产环境不输出到控制台 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/mybatis-demo-prod.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/mybatis-demo-prod.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>90</MaxHistory>
<TotalSizeCap>10GB</TotalSizeCap>
</rollingPolicy>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Plumelog日志输出,生产环境必须 -->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>${plumelog.appName}</appName>
<redisHost>${plumelog.redisHost}</redisHost>
<redisAuth>${plumelog.redisAuth}</redisAuth>
<redisDb>${plumelog.redisDb}</redisDb>
<env>${plumelog.env}</env>
<!-- 启用追踪码 -->
<expand>traceId</expand>
</appender>
<!-- 配置日志输出级别,生产环境通常只记录INFO及以上级别 -->
<root level="INFO">
<appender-ref ref="file"/>
<appender-ref ref="plumelog"/>
</root>
</springProfile>
<!-- 默认配置,如果没有指定profile -->
<springProfile name="!dev && !test && !prod">
<!--输出到控制台,默认使用 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到文件,默认使用 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/mybatis-demo-default.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/mybatis-demo-default.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TotalSizeCap>1GB</TotalSizeCap>
</rollingPolicy>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Plumelog日志输出 -->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>${plumelog.appName}</appName>
<redisHost>${plumelog.redisHost}</redisHost>
<redisAuth>${plumelog.redisAuth}</redisAuth>
<redisDb>${plumelog.redisDb}</redisDb>
<env>${plumelog.env}</env>
<!-- 启用追踪码 -->
<expand>traceId</expand>
</appender>
<!-- 配置日志输出级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="file"/>
<appender-ref ref="plumelog"/>
</root>
</springProfile>
</configuration>三、修改配置文件
这里我们需要在springboot的application文件中配置对应的配置项,我这里的配置项有:
# plumelog配置 plumelog.appName=mybatis-demo plumelog.redisHost=150.109.63.105 plumelog.redisPort=6379 plumelog.redisAuth=123456 plumelog.redisDb=10 plumelog.env=dev # 日志配置 logging.config=classpath:logback-spring.xml logging.level.com.mybatis.demo=DEBUG logging.level.com.baomidou.mybatisplus=DEBUG
这里有个需要注意的地方,就是日志是直接吐到redis中的,咱们前面的plumelog服务端也是从redis的中获取的,所以这里的redisdb需要和plumelog服务端配置的redisdb匹配上,刚才我们在plumelog的服务端上配置的redisdb是10,所以项目里面配置也是10,不然数据吐到其他地方去了,会导致plumelog服务端的dashboard上看不到数据。
四、编写全链路配置文件
前面1-3,我们只是配置了在java中把日志向plumelog中吐,直接启动的话,其实会看到是没有追踪码的,例如:
所以这里的话,我们还需要配置taceid,具体步骤如下:
1)创建TraceIdFilter
这里我们在项目的config文件夹下创建一个TraceIdFilter的类,然后把下面的代码放进去
package com.mybatis.demo.config; import org.slf4j.MDC; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.UUID; @Component public class TraceIdFilter implements Filter { private static final String TRACE_ID = "traceId"; @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; // 从请求头中获取traceId,如果不存在则生成一个新的 String traceId = httpRequest.getHeader(TRACE_ID); if (traceId == null || traceId.isEmpty()) { traceId = generateTraceId(); } // 将traceId放入MDC中,这样logback就可以使用它 MDC.put(TRACE_ID, traceId); try { chain.doFilter(request, response); } finally { // 清理MDC,避免线程间数据污染 MDC.remove(TRACE_ID); } } private String generateTraceId() { return UUID.randomUUID().toString().replace("-", "").substring(0, 16); } }
2、引入配置
接下来我们还需要在config下面的webconfig.java文件中添加配置(如果没有这个文件的话,则进行创建即可),完整的内容如下:
package com.mybatis.demo.config;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean<TraceIdFilter> traceIdFilterRegistration() {
FilterRegistrationBean<TraceIdFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new TraceIdFilter());
registration.addUrlPatterns("/*"); // 应用到所有URL
registration.setName("traceIdFilter");
registration.setOrder(1); // 设置优先级
return registration;
}
}以上我们就添加上了链路日志,此时我们就可以启动项目进行测试了。
五、启动测试
这里由于是演示项目,所以只有一个controller,我们在这里使用@slf4j打印日志,如下图:
所以可以看到原来的代码打印的日志是完全不需要修改的。然后我们启动项目,访问这个接口,然后再登录plumelog的dashboard上查看具体的日志:
可以看到数据出来了,并且带有追踪码。只要是一个链路下的,所有的逻辑,对应的日志都是同一个追踪码。
以上就是关于springboot项目集成plumelog的案例,当然这里还有几个问题,由于目前只是临时演示,所以没有做很全,这里还会出现以下几个问题:
1、如果项目中请求的不是接口,而是定时器之类逇,这时候是没有追踪码的 2、如果是springcloud 微服务的话,使用feign调用也需要关联追踪码
以上两个问题由于现在没有测试环境,所以暂时不掩饰了,也比较简单,遇到的时候,咱们再编写对应的代码进行演示。
最后按照惯例,附上本案例的源码,登录后即可下载。






还没有评论,来说两句吧...