当前位置: 首页 > news >正文

Springboot集成Log4j2+MDC串联单次请求的日志

技术选型

Springboot项目中有很多日志框架,这里针对最常见的做一下简单的对比。

对比维度logbacklog4j2
架构同步阻塞IO,异步依赖 AsyncAppender队列原生异步
性能表现中,异步吞吐量 ≈8万条/秒高,异步吞吐量 ≈20万条/秒
springboot集成开箱即用​​,无需额外配置需排除 spring-boot-starter-logging并显式引入 log4j2依赖
适用场景​中小项目、快速开发、日志量 <10万条/秒高并发系统​​、金融级应用、物联网日志采集

稍微有点规模的公司都用log4j2,所以这里以log4j2为例子。

引入依赖

因为spring-web自带logback框架,因此需要移除。

        <dependency><!--移除自带的logback--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>

使用

引入Slf4j注解

import lombok.extern.slf4j.Slf4j;import org.slf4j.MDC;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;@Slf4j
@Controller
public class BasicController {// http://127.0.0.1:8080/hello?name=lisi@RequestMapping("/hello")@ResponseBodypublic String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {log.info("hello, {}", name);return "Hello " + name;}
}

在这里插入图片描述

配置log4j2-spring.xml文件

如果需要自定义日志的格式、输出位置等,可以通过该文件来配置。

该文件需要放在项目的resources目录下

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Properties><Property name="SYSTEM_NAME">my-test</Property><Property name="LOG_PATTERN">[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%-5level] - [${SYSTEM_NAME}] - [%X{TRACE_ID}] - [%X{USER_NAME}] - [%c{1}]: %msg%n</Property></Properties><Appenders><Console name="Console" target="SYSTEM_OUT" follow="true"><PatternLayout pattern="${LOG_PATTERN}"/></Console></Appenders><Loggers><Logger name="org.springframework" level="INFO"/><logger name="org.mybatis" level="DEBUG"/><Root level="DEBUG"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

如上代码:
Appenders里面配置了日志输出到控制台,
内部PatternLayout 配置了输出的格式。
通过${}从property获取参数,
通过%X{}从MDC获取参数。

配合下方:

import lombok.extern.slf4j.Slf4j;import org.slf4j.MDC;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.UUID;@Slf4j
@Controller
public class BasicController {// http://127.0.0.1:8080/hello?name=lisi@RequestMapping("/hello")@ResponseBodypublic String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {MDC.put("USER_NAME",name);MDC.put("TRACE_ID", String.valueOf(UUID.randomUUID()));log.info("hello, {}", name);log.warn("第二条日志");return "Hello " + name;}
}

在这里插入图片描述

如上,项目名,用户名称,traceid等都打印出来了。
MDC底层本质上就是一个ThreadLocal,因此只要是同一个线程,都能从里面获取到所需参数。
最好是在前端请求头传traceid,然后过滤器将该参数放入MDC。
这样打印的日志都会携带该traceid,通过traceid即可查出该请求的全部日志。

思考:
异步或发MQ该如何携带该traceid?

http://www.xdnf.cn/news/1248481.html

相关文章:

  • HBM Basic(VCU128)
  • 《Python基础》第3期:使用PyCharm编写Hello World
  • Leetcode-2080区间内查询数字的频率
  • 查看部署在K8S服务的资源使用情况
  • LOOP Finance:一场 Web3 共和国中的金融制度实验
  • 创维智能融合终端DT741_移动版_S905L3芯片_安卓9_线刷固件包
  • Linux驱动24 --- RkMedia 视频 API 使用
  • 前端保持和服务器时间同步的方法【使用vue3举例】
  • Tasks and Deadlines(Sorting and Searching)
  • Mysql-事务
  • Nginx入门:高性能Web服务器详解
  • 【图像算法 - 09】基于深度学习的烟雾检测:从算法原理到工程实现,完整实战指南
  • Claude Code实战体验:AI智能编程助手如何重塑开发工作流?
  • 2. JS 有哪些数据类型
  • Linux的NFS与Autofs配置指南
  • nodejs 编程基础01-NPM包管理
  • 最优化中常见的优化理论
  • Shader开发(七)创建第一个Shader项目
  • 游戏画面总是卡顿怎么办 告别延迟畅玩游戏
  • DDoS 防护的未来趋势AI 如何改变安全行业
  • MySQL 5.7 和 8.0 离线安装教程(图文版适合电脑小白)
  • C++返回值优化(RVO):高效返回对象的艺术
  • 【基础】第八篇 Java 位运算符详解:从基础到实战应用
  • Unknown initial character set index ‘255’,Kettle连接MySQL数据库常见错误及解决方案大全
  • nuxt学习笔记
  • 什么是mysql的垂直分表,理论依据是什么,如何使用?
  • LeetCode 刷题【31. 下一个排列】
  • Apache OFBiz Scrum 组件命令注入漏洞
  • 力扣148:排序链表
  • 不可变集合