当前位置: 首页 > article >正文

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

文章目录

  • Pre
  • 官网
  • 集成Log4j1.x步骤
    • POM依赖
    • 使用
      • 第一步:编写 Log4j 配置文件
      • 第二步:代码
  • 原理分析
    • 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

在这里插入图片描述


lo4j1 已经End Of Life , 不推荐使用,这里仅作为技术分析

集成Log4j1.x步骤

在这里插入图片描述

POM依赖

要实现 SLF4J 与 Log4j 1.x 的集成,需要以下 Maven 依赖:

  <!-- slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.16</version>
        </dependency>

        <!-- slf4j-log4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>2.0.13</version>
        </dependency>

        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

在这里插入图片描述

  • slf4j-api: SLF4J 的核心 API,用于定义日志接口。
  • slf4j-log4j12: SLF4J 与 Log4j 1.x 的适配器,它将 SLF4J 的日志调用转发到 Log4j 1.x。
  • log4j: Log4j 1.x 的核心库,实际执行日志记录。

使用

第一步:编写 Log4j 配置文件

在类路径下添加 log4j.properties 配置文件来配置 Log4j 的输出格式和日志级别:

# ?????????????? DEBUG?????????????
log4j.rootLogger=DEBUG, console, file

# ???????
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L ===>>> %m%n

# ???????????
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=application.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# ?????????????
log4j.logger.com.artisan=DEBUG

第二步:代码

在代码中使用 SLF4J 的 LoggerFactory 获取日志实例,并记录日志:

 package com.artisan;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Hello world!
 *
 */
public class Slf4jLog4J1Example {
    private static final Logger logger= LoggerFactory.getLogger(Slf4jLog4J1Example.class);

    public static void main(String[] args){
        logger.trace("Slf4jLog4J1Example This is a trace message");
        logger.debug("Slf4jLog4J1Example This is a debug message");
        logger.info("Slf4jLog4J1Example This is an info message");
        logger.warn("Slf4jLog4J1Example This is a warning message");
        logger.error("Slf4jLog4J1Example This is an error message");
    }
}

在这里插入图片描述


原理分析

1. 获取对应的 ILoggerFactory

SLF4J 的日志实现通过 StaticLoggerBinder 类将 SLF4J 与 Log4j 1.x 绑定。在 slf4j-log4j12 包中,StaticLoggerBinder 类的作用是为 SLF4J 提供 Log4j 的 ILoggerFactory 实现。

  • SLF4J 会通过类加载器加载 org/slf4j/impl/StaticLoggerBinder.class
  • 找到 StaticLoggerBinder 后,会调用其 getSingleton() 方法来获取一个 ILoggerFactory 实例。
StaticLoggerBinder.getSingleton().getLoggerFactory();

slf4j-log4j12 包中,StaticLoggerBinder 创建的 ILoggerFactoryLog4jLoggerFactory,它是 Log4j 与 SLF4J 集成的核心。


2. 根据 ILoggerFactory 获取 Logger 实例

Log4jLoggerFactory 实现了 SLF4J 的 ILoggerFactory 接口,并负责返回 SLF4J 的 Logger 实例。它使用 Log4j 1.x 的原生方式来创建日志记录器,然后将其封装成 SLF4J 的 Logger 实例。

org.apache.log4j.Logger log4jLogger;
if (name.equalsIgnoreCase(Logger.ROOT_LOGGER_NAME)) {
    log4jLogger = LogManager.getRootLogger();
} else {
    log4jLogger = LogManager.getLogger(name);
}
Logger newInstance = new Log4jLoggerAdapter(log4jLogger);
  • LogManager.getRootLogger()LogManager.getLogger(name):这两行代码使用 Log4j 1.x 的方式获取日志记录器实例。这会触发 Log4j 配置文件的加载(例如 log4j.properties)。
  • Log4jLoggerAdapter:将原生的 Log4j 1.x Logger 对象包装成 SLF4J 的 Logger 接口实例。这意味着,SLF4J 的 Logger 实际上是一个 Log4jLoggerAdapter,该适配器负责将日志请求委托给 Log4j 1.x 的 Logger

3. 日志记录过程

当调用 SLF4J 的日志方法(如 logger.debug())时,实际的日志记录将通过 Log4jLoggerAdapter 转发到 Log4j 1.x 的 Logger 实例,从而完成日志输出。


小结

  • 依赖关系:通过 slf4j-apislf4j-log4j12log4j 三个库实现 SLF4J 与 Log4j 1.x 的集成。
  • 核心过程:SLF4J 通过 StaticLoggerBinder 类加载并绑定 Log4j。Log4jLoggerFactory 负责根据 ILoggerFactory 返回 Logger 实例,并通过 Log4jLoggerAdapter 将 Log4j 1.x 的日志记录器包装为 SLF4J 的 Logger 实现。
  • 日志调用转发:最终的日志调用会被转发到 Log4j 1.x 进行实际的日志记录,使用 Log4j 的配置和输出方式。

在这里插入图片描述


http://www.kler.cn/a/457641.html

相关文章:

  • 探索Docker Compose:轻松管理多容器应用
  • C++访问数据库
  • 网络安全 | 信息安全管理体系(ISMS)认证与实施
  • epoll 水平ET跟边缘LT触发的区别是什么
  • 二维码文件在线管理系统-收费版
  • Leetcode打卡:我的日程安排表II
  • 【从零开始入门unity游戏开发之——C#篇34】C#匿名函数(delegate )和Lambda表达式
  • 【探花交友】通用设置总结笔记
  • Spring Boot Actuator、Spring Boot Actuator使用、Spring Boot Actuator 监控、Spring程序监控
  • libreoffice在Windows和Linux环境的安装和结合Springboot使用教程
  • Windows安装Confluence详解
  • YOLOv10-1.1部分代码阅读笔记-conv.py
  • React(二)——注册页/登录页/Reducer/
  • Linux实验报告6-用户管理
  • Metagenome宏基因组,未识别的物种unclassified
  • 【Unity3D】ECS入门学习(五)共享组件 ISharedComponentData
  • MySQL三层B+树能存多少条数据
  • 鸿蒙项目云捐助第三十一讲云捐助项目云前台显示商品列表
  • UDP协议解说
  • RJ45网口模块设计
  • 常见网络攻击场景常被用于测试系统安全性
  • Android中使用AIDL实现进程通信
  • ArrayList和LinkedList的区别、优缺点与使用场景
  • 生产力利器,Mac 系统优选,keychron K10Max 三模键盘体验分享
  • QT-------认识QT
  • 呼叫中心中间件免费体验测试和freeswitch部署方案