slf4j 怎么配置日志分析打印 traceID

SLF4J提供了一种灵活的日志记录方式,允许我们在日志中添加自定义信息,如用户IP、HTTP User-Agent和线程跟踪ID。通过MDC(Mapped Diagnostic Context)可以在日志中插入这些上下文信息,例如通过AOP记录每个请求的traceId。在Logback配置文件中,可以使用`%X{mdc_trace_id}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

slf4j 打印traceID介绍

slf4j除了trace、debug、info、warn、error这几个日志接口外,还可以配合日志分析将数据写入日志。

在使用日志接口时我们一般这么做

Logger LOG = LoggerFactory.getLogger("LOGNAME_OR_CLASS");
if(LOG.isDebugEnabled()) {
    LOG.debug("log debug");
 }

那么 如果我们想在日志文件中打印自定义信息该怎么办呢?比如打印以下信息:

  1. 我们想在日志中体现请求用户IP地址
  2. 用户使用http客户端的user-agent
  3. 记录一次处理线程的日志跟踪编号(这个编号目的是为了查询日志方便,结合grep命令能根据跟踪编号将本次的处理日志全部输出)

解决办法

org.slf4j.MDC我个人会用AOP或Filter或Interceptor这类工具配合使用,获得你希望输出到日志的变量并调用MDC.put(String key, String val),比如下面代码

片段第5行:

@Around(value = "execution(* com.xx.xx.facade.impl.*.*(..))", argNames="pjp")
 public Object validator(ProceedingJoinPoint pjp) throws Throwable {
   try {
     String traceId = TraceUtils.begin();
     MDC.put("mdc_trace_id", traceId);
     Object obj = pjp.proceed(args);
     return obj;
   } catch (Throwable e) {
     //TODO 处理错误
   } finally{
     TraceUtils.endTrace();
   }
 }  

代码通过AOP记录了每次请求的traceId并使用变量"mdc_trace_id"记录,在日志配置文件里需要设置变量才能将"mdc_trace_id"输出到日志文件中。我以logback

配置文件为例,看日志第10行%X{mdc_trace_id}:

<``appender` `name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
   ``<``file``>${CATALINA_BASE}/logs/all.log</``file``>
   ``<``rollingPolicy` `class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     ``<!-- daily rollover -->
     ``<``fileNamePattern``>${CATALINA_BASE}/logs/all.%d{yyyy-MM-dd}.log</``fileNamePattern``>
     ``<!-- keep 30 days' worth of history -->
     ``<``maxHistory``>30</``maxHistory``>
   ``</``rollingPolicy``>
   ``<``encoder` `charset="UTF-8">
     ``<``pattern``>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - traceId:[%X{mdc_trace_id}] - %msg%n</``pattern``>
   ``</``encoder``>
 ``</``appender``>

MDC带来的好处

  1. 如果你的系统已经上线,突然有一天老板说我们增加一些用户数据到日志里分析一下。如果没有MDC我猜此时此刻你应该处于雪崩状态。MDC恰到好处的让

    你能够实现在日志上突如其来的一些需求

  2. 如果你是个代码洁癖,封装了公司LOG的操作,并且将处理线程跟踪日志号也封装了进去,但只有使用了你封装日志工具的部分才能打印跟踪日志号,其他部

    分(比如hibernate、mybatis、httpclient等等)日志都不会体现跟踪号。当然我们可以通过linux命令来绕过这些困扰。

  3. 使代码简洁、日志风格统一

### SLF4J 日志输出使用方法 SLF4J(Simple Logging Facade for Java)是一个日志门面,它允许开发者通过统一接口记录日志,而无需关心底层具体实现的日志框架。以下是关于如何使用 SLF4J 输出日志的具体说明。 #### 1. 添加依赖 为了在项目中使用 SLF4J,需要先引入相应的 Maven 或 Gradle 依赖。以下是以 Maven 为例的依赖配置: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <!-- 如果使用 Log4j 实现 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.36</version> </dependency> ``` #### 2. 编写代码示例 可以通过 `@Slf4j` 注解或者手动创建 Logger 对象来输出日志。以下是两种方式的示例: ##### 方式一:使用 Lombok 的 @Slf4j 注解 Lombok 提供了一个便捷的方式来自动生成 Logger 对象。 ```java import lombok.extern.slf4j.Slf4j; @Slf4j public class Example { public static void main(String[] args) { log.trace("This is a trace message."); log.debug("This is a debug message."); log.info("This is an info message."); // 默认情况下会打印此级别的日志 log.warn("This is a warn message."); log.error("This is an error message."); } } ``` ##### 方式二:手动创建 Logger 对象 如果不使用 Lombok,也可以手动创建 Logger 对象。 ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Example { private static final Logger log = LoggerFactory.getLogger(Example.class); public static void main(String[] args) { log.trace("This is a trace message."); log.debug("This is a debug message."); log.info("This is an info message."); log.warn("This is a warn message."); log.error("This is an error message."); } } ``` #### 3. 配置日志级别 日志级别决定了哪些类型的日志会被输出。常见的日志级别有 TRACE、DEBUG、INFO、WARN、ERROR 和 FATAL[^4]。可以在 `log4j.properties` 文件或 Spring Boot 的 `application.yml` 中设置日志级别。 ##### 使用 log4j.properties 配置 如果使用的是传统的 Log4j,则可以在 `log4j.properties` 文件中指定日志级别和输出格式。 ```properties # 指定根日志器的默认配置 log4j.rootLogger=info, console # 控制台日志输出的 Appender log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%-5p [%t]: %m%n ``` ##### 使用 application.yml 配置 如果是基于 Spring Boot 的项目,推荐使用 YAML 格式的配置文件。 ```yaml logging: level: root: info com.example: debug # 可针对特定包设置不同的日志级别 pattern: console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n" ``` #### 4. 运行效果 当运行上述代码时,只有满足当前日志级别及以上级别的日志才会被输出。例如,如果设置了日志级别为 `INFO`,则只会输出 `INFO`、`WARN`、`ERROR` 和 `FATAL` 级别的日志。 --- ### 注意事项 - **性能优化**:为了避免不必要的字符串拼接操作,在调用低优先级的日志方法前可以先检查该级别的日志是否启用。例如: ```java if (log.isDebugEnabled()) { log.debug("User id: {}", userId); } ``` - **桥接旧的日志框架**:SLF4J 支持通过桥接工具兼容其他日志框架,如 JCL(Jakarta Commons Logging)、Log4j 等[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半夏_2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值