Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成logback 及 原理分析

发布于:2025-02-11 ⋅ 阅读:(60) ⋅ 点赞:(0)

在这里插入图片描述


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-corelogback-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.2StaticLoggerBinder 创建并返回 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.2ch.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 会根据日志级别(如 DEBUGINFO)和配置的 Appender 进行输出。

小结

  • 依赖关系:通过 slf4j-apilogback-corelogback-classic 实现 SLF4J 与 Logback 的集成。
  • 核心过程:SLF4J 通过 StaticLoggerBinder 类绑定到 Logback,LoggerContext 返回 Logback 的 Logger 实例。
  • 日志调用转发:SLF4J 的日志调用会被转发到 Logback 的 Logger 实例,并根据 logback.xml 配置进行日志输出。

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到