SpringBoot如何集成日志模块呢?
下文笔者讲述SpringBoot中集成日志模块的方法及示例分享,如下所示
SpringBoot集成日志模块的实现思路
1.引入相关的依赖 2.配置logback的配置文件 3.自定义日志拦截器 LogInterceptor 4.添加拦截器 5.测试controller是否满足效果例:
一、pom依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <!--lombok配置--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency> </dependencies>
二、整合logback
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--日志存储路径--> <property name="log" value="D:/test/resources/log" /> <!-- 控制台输出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--输出格式化--> <pattern>[%X{TRACE_ID}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!-- 按天生成日志文件 --> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件名--> <FileNamePattern>${log}/%d{yyyy-MM-dd}.log</FileNamePattern> <!--保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>[%X{TRACE_ID}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root> </configuration>
三、自定义日志拦截器LogInterceptor
功能: 每一次链路,线程维度,添加最终的链路ID TRACE_ID public class LogInterceptor implements HandlerInterceptor { private static final String TRACE_ID = "TRACE_ID"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String tid = UUID.randomUUID().toString().replace("-", ""); // 可以考虑让客户端传入链路ID,但需保证一定的复杂度唯一性;如果没使用默认UUID自动生成 if (!StringUtils.isEmpty(request.getHeader("TRACE_ID"))) { tid = request.getHeader("TRACE_ID"); } MDC.put(TRACE_ID, tid); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { MDC.remove(TRACE_ID); } }
五、添加拦截器
@Configuration public class WebConfigurerAdapter implements WebMvcConfigurer { @Bean public LogInterceptor logInterceptor() { return new LogInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(logInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/testxx.html"); } }
Controller测试
@Slf4j @RestController @RequiredArgsConstructor public class TestController { private final IUservice userService; @GetMapping("doTest") public String doTest(@RequestParam("name") String name) { log.info("入参 name = {}", name); testTrace(); log.info("调用结束 name={}", name); userService.insertUser(); return "Hello," + name; } private void testTrace() { log.info("这是一行info日志"); log.error("这是一行error日志"); testTrace2(); } private void testTrace2() { log.info("这也是一行info日志"); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。