文章目录
- Pre
- 官网
- 集成步骤
- POM依赖
- 使用
- 第一步:编写 Logback 的配置文件
- 第二步:在代码中使用 SLF4J
- 原理分析
- 1. 获取对应的 `ILoggerFactory`
- 2. 根据 `ILoggerFactory` 获取 `Logger` 实例
- 3. 日志记录过程
- 小结
Pre
Java - 日志体系_Apache Commons Logging(JCL)日志接口库
Java - 日志体系_Apache Commons Logging(JCL)日志接口库_适配Log4j2 及 源码分析
Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J实现原理分析
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成JUL 及 原理分析
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成Log4j1.x 及 原理分析
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成Log4j2.x 及 原理分析
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成logback 及 原理分析
官网
https://slf4j.org/
Simple Logging Facade for Java (SLF4J) 用作各种日志记录框架(e.g. java.util.logging、logback、log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志记录框架 时间。
请注意,启用 SLF4J 的库意味着仅添加一个强制依赖项,即 slf4j-api.jar。 如果在类路径上找不到绑定/提供程序,则 SLF4J 将 default 为 no-operation 实现。
SLF4J user manual:https://slf4j.org/manual.html
集成步骤
POM依赖
<!-- slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.5.15</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.15</version>
</dependency>
slf4j-api
: SLF4J 的核心 API,用于定义日志接口。logback-core
和logback-classic
: Logback 的核心和经典模块,提供日志记录功能,并与 SLF4J 集成。
使用
第一步:编写 Logback 的配置文件
创建一个 logback.xml
配置文件,设置 Logback 的日志级别和输出格式。
<configuration>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} ===>>>>>> %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>application.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 可选:配置日志文件滚动 -->
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天滚动日志文件 -->
<fileNamePattern>application-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 最多保留 30 天的日志文件 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 根日志记录器 -->
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="ROLLING_FILE" />
</root>
<!-- 可选:配置特定包的日志级别 -->
<logger name="com.artisan" level="info" />
</configuration>
第二步:在代码中使用 SLF4J
在代码中通过 LoggerFactory.getLogger()
获取日志记录器实例,并使用 SLF4J API 记录日志。
package com.artisan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Slf4jLogback
*
*/
public class Slf4jLogback {
private static final Logger logger= LoggerFactory.getLogger(Slf4jLogback.class);
public static void main(String[] args){
logger.trace("Slf4jLogback This is a trace message");
logger.debug("Slf4jLogback This is a debug message");
logger.info("Slf4jLogback This is an info message");
logger.warn("Slf4jLogback This is a warning message");
logger.error("Slf4jLogback This is an error message");
}
}
原理分析
1. 获取对应的 ILoggerFactory
Logback 与 SLF4J 的集成通过 StaticLoggerBinder
类完成。StaticLoggerBinder
是 Logback 提供的一个实现,用于将 SLF4J 的日志接口与 Logback 的日志实现绑定。
- 步骤 1.1:SLF4J 通过类加载器加载
org/slf4j/impl/StaticLoggerBinder.class
类,找到了logback-classic
包中的绑定类。 - 步骤 1.2:
StaticLoggerBinder
创建并返回ILoggerFactory
实例。Logback 使用LoggerContext
作为ILoggerFactory
的实现类。
StaticLoggerBinder.getSingleton().getLoggerFactory(); // 获取 LoggerContext 实例
在 LoggerContext
中,Logback 初始化时会加载并解析配置文件(如 logback.xml
)。这确保了日志配置在应用启动时就已准备好。
2. 根据 ILoggerFactory
获取 Logger
实例
LoggerContext
是 Logback 中用于管理日志的核心对象,它实现了 SLF4J 的 ILoggerFactory
接口。通过 LoggerContext
,SLF4J 会获得实际的 Logger
实例。
LoggerContext
会根据日志名称返回一个ch.qos.logback.classic.Logger
实例,这个 Logger 类实现了 SLF4J 的Logger
接口。
Logger logger = loggerContext.getLogger(name); // 获取 Logback 的 Logger 实例
-
步骤 2.1:当 SLF4J 调用
LoggerFactory.getLogger()
时,它会通过LoggerContext
获取对应的Logger
实例,这个实例是 Logback 自定义的Logger
,但它实现了 SLF4J 的Logger
接口。 -
步骤 2.2:
ch.qos.logback.classic.Logger
实现了 SLF4J 定义的Logger
接口,因此可以通过 SLF4J 的 API 记录日志,并将日志委托给 Logback 来处理。
3. 日志记录过程
当调用 SLF4J 的日志方法时(如 logger.debug()
),日志请求会被转发到 Logback 中的 Logger
实例,该实例最终会根据 logback.xml
配置输出日志。Logback 的 Logger
实现会委托给 Appender
(如 ConsoleAppender
)来完成日志输出。
- 日志输出的格式由
logback.xml
中定义的PatternLayout
决定。 - Logback 会根据日志级别(如
DEBUG
、INFO
)和配置的Appender
进行输出。
小结
- 依赖关系:通过
slf4j-api
、logback-core
和logback-classic
实现 SLF4J 与 Logback 的集成。 - 核心过程:SLF4J 通过
StaticLoggerBinder
类绑定到 Logback,LoggerContext
返回 Logback 的Logger
实例。 - 日志调用转发:SLF4J 的日志调用会被转发到 Logback 的
Logger
实例,并根据logback.xml
配置进行日志输出。