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

文章目录

  • Pre
  • 官网
  • 集成步骤
    • POM依赖
    • 使用
      • [第一步:编写 Logback 的配置文件](#第一步:编写 Logback 的配置文件)
      • [第二步:在代码中使用 SLF4J](#第二步:在代码中使用 SLF4J)
  • 原理分析
    • [1. 获取对应的 `ILoggerFactory`](#1. 获取对应的 ILoggerFactory)
    • [2. 根据 `ILoggerFactory` 获取 `Logger` 实例](#2. 根据 ILoggerFactory 获取 Logger 实例)
    • [3. 日志记录过程](#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依赖

xml 复制代码
   <!-- 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 的日志级别和输出格式。

xml 复制代码
<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 记录日志。

java 复制代码
 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 的实现类。
java 复制代码
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 接口。
java 复制代码
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 配置进行日志输出。
相关推荐
猩猩之火2 小时前
logback日志文件多环境配置路径
spring boot·logback
_UMR_2 天前
Logback的使用
java·spring boot·logback
superCleanCoder4 天前
logback之自定义pattern使用的转换器
java·spring boot·logback
superCleanCoder4 天前
logback之pattern详解以及源码分析
spring boot·后端·logback
龙少95434 天前
【Logback详解】
java·spring boot·后端·logback
m0_748256344 天前
springboot整合Logback
spring boot·后端·logback
superCleanCoder5 天前
logback之自定义过滤器
logback
暮色里de白雪檐5 天前
基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案
logback·日志·slf4j·aop·日志打印
m0_748247555 天前
Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决
java·spring boot·logback