1. 简介
Simple Logging Facade for Java (SLF4J) 用作各种日志框架(例如 java.util.logging、log4j 1.x、reload4j 和 logback)的简单外观或抽象。 SLF4J 允许最终用户在部署时插入所需的日志记录框架。
2. @Slf4j注解 的原理解析
在实际项目中 当我们标记Lombok提供的@Slf4j注解时,可以直接在代码块中使用log对象进行日志输出。
编译后
编译后 注解消失,生成Logger对象
第一次编译,未初始化:
performInitialization()方法中的bind方法是绑定日志框架的核心方法
bind()方法中通过findPossibleStaticLoggerBinderPathSet()方法加载日志框架的路径
总的来说: slf4j 组件对外提供统一的日志对象访问接口,log4j 这类组件会实现这个接口中的相关标准规定。获取真正的记录日志的Logger对象,都是通过LoggerFactory的getLogger()方法来获取的 :Logger logger = LoggerFactory.getLogger(App.class) 。这个方法会bind(绑定)具体的实现了slf4j组件标准的类,所有的实现了slf4j标准的类都必定有一约定好的类:org/slf4j/impl/StaticLoggerBinder.class。通过 loggerFactoryClassLoader.getResources(“org/slf4j/impl/StaticLoggerBinder.class”) 获取到类的完整路径,从而获取到具体实现类,然后就会调用这个类(对 log4j 来说就是Log4jLoggerFactory这个类)的getLogger()方法获取到真正记录日志的Logger对象,从而实现日志的记录。
3.MDC(Mapped Diagnostic Context)的使用和作用。
MDC(Mapped Diagnostic Context)是 SLF4J(Simple Logging Facade for Java)提供的一个高级特性,用于在多线程环境下记录和管理日志的上下文信息。MDC 允许你在一个线程中设置和存储上下文信息,然后在该线程中的任何地方记录这些信息,而不必手动将这些信息传递给每个日志记录语句。这在处理多线程或分布式应用程序中非常有用,因为它允许你为每个线程或请求设置自定义的上下文信息,以便更好地追踪和分析日志。
以下是 MDC 的主要使用和作用:
-
上下文信息的存储和传递:MDC 允许你在应用程序中的某个地方设置上下文信息,例如用户ID、会话ID、请求ID等。然后,这些信息将被存储在线程的上下文中,可以在同一线程内的任何地方访问。
-
日志记录时的信息丰富:通过 MDC,你可以在日志记录语句中引用上下文信息,从而使日志更加丰富和有用。例如,你可以在日志消息中包含用户ID、请求ID等信息,以便在日志中跟踪特定用户或请求的操作。
-
多线程安全:MDC 是线程安全的,每个线程都有自己的 MDC 上下文,不会干扰其他线程的上下文信息。这使得在多线程环境中使用 MDC 非常方便。
-
日志跟踪和诊断:MDC 可以用于追踪和诊断问题,特别是在分布式系统中。通过将请求ID或会话ID设置为上下文信息,你可以跟踪特定请求的整个生命周期,甚至跨越多个服务和节点。
public class MyLogger {
private static final Logger logger = LoggerFactory.getLogger(MyLogger.class);
public static void main(String[] args) {
// 设置上下文信息
MDC.put("userID", "12345");
MDC.put("requestID", "ABCDE");
// 记录日志
logger.info("User {} made a request with ID {}", MDC.get("userID"), MDC.get("requestID"));
// 清除上下文信息
MDC.clear();
}
}