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

news2025/1/3 1:52:48

文章目录

  • 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.coloradmin.cn/o/2268053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解VHDL如何编写Testbench

1.概述 仿真测试平台文件(Testbench)是可以用来验证所设计的硬件模型正确性的 VHDL模型&#xff0c;它为所测试的元件提供了激励信号&#xff0c;可以以波形的方式显示仿真结果或把测试结果存储到文件中。这里所说的激励信号可以直接集成在测试平台文件中&#xff0c;也可以从…

Linux day 11 28

一.Linux简介 1.1 Linux介绍 Linux 是一套免费使用和自由传播的操作系统。说到操作系 统&#xff0c;大家比较熟知的应该就是 Windows 和 MacOS 操作系统&#xff0c; 我们今天所学习的 Linux 也是一款操作系统。 1.2 Linux发展历史 时间&#xff1a; 1991 年 地点&#xf…

【深度学习环境】NVIDIA Driver、Cuda和Pytorch(centos9机器,要用到显示器)

文章目录 一 、Anaconda install二、 NIVIDIA driver install三、 Cuda install四、Pytorch install 一 、Anaconda install Step 1 Go to the official website: https://www.anaconda.com/download Input your email and submit. Step 2 Select your version, and click i…

Lecture 17

10’s Complement Representation 主要内容&#xff1a; 1. 10’s 补码表示: • 10’s 补码表示法需要指定表示的数字位数&#xff08;用 n 表示&#xff09;。 • 表示的数字取决于 n 的位数&#xff0c;这会影响具体数值的解释。 2. 举例: • 如果采用 3 位补码&…

惠州市政数局局长杨伟斌:惠州市公共数据授权运营模式探索

近期&#xff0c;2024数字资产管理大会召开。会上&#xff0c;惠州市政务服务和数据管理局局长杨伟斌在会上做了题为基于“隐私计算区块链”的惠州市公共数据授权运营模式探索主旨演讲&#xff0c;从三个方面展开&#xff0c;一是建制度汇数据&#xff0c;二是夯基础保安全&…

C#编写的金鱼趣味小应用 - 开源研究系列文章

今天逛网&#xff0c;在GitHub中文网上发现一个源码&#xff0c;里面有这个金鱼小应用&#xff0c;于是就下载下来&#xff0c;根据自己的C#架构模板进行了更改&#xff0c;最终形成了这个例子。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 初始化&#xff1b; 将样…

探索贝叶斯魔法和误差的秘密

引言 今天我们要一起学习两个神秘的魔法概念&#xff1a;贝叶斯魔法和误差的秘密。这些概念听起来可能有点复杂&#xff0c;但别担心&#xff0c;我会用最简单的方式来解释它们。 一、贝叶斯魔法 贝叶斯魔法是一种预测的魔法&#xff0c;它帮助我们理解在不确定的情况下事情…

深度学习blog-卷积神经网络(CNN)

卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种广泛应用于计算机视觉领域&#xff0c;如图像分类、目标检测和图像分割等任务中的深度学习模型。 1. 结构 卷积神经网络一般由以下几个主要层组成&#xff1a; 输入层&#xff1a;接收…

深度学习笔记(6)——循环神经网络RNN

循环神经网络 RNN 核心思想:RNN内部有一个“内部状态”,随着序列处理而更新 h t f W ( h t − 1 , x t ) h_tf_W(h_{t-1},x_t) ht​fW​(ht−1​,xt​) 一般来说 h t t a n h ( W h h h t − 1 W x h x t ) h_ttanh(W_{hh}h_{t-1}W_{xh}x_t) ht​tanh(Whh​ht−1​Wxh​xt…

最新版Edge浏览器加载ActiveX控件技术——alWebPlugin中间件V2.0.28-迎春版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

【前端,TypeScript】TypeScript速成(三):枚举类型

枚举类型 枚举类型是 TypeScript 相较于 JavaScript 而言特有的部分。一个简单的枚举声明如下&#xff1a; enum HTTPStatus {OK,NOT_FOUND,INTERNAL_STATUS_ERROR, }与编译成 JavaScript 的代码相比较&#xff1a; 显然 TypeScript 非常的简洁。 尝试使用上述枚举类型&…

Webpack学习笔记(6)

首先搭建一个基本的webpack环境&#xff1a; 执行npm init -y&#xff0c;创建pack.json&#xff0c;保存安装包的一些信息 执行npm install webpack webpack-cli webpack-dev-server html-webpack-plugin -D&#xff0c;出现node_modules和package-lock.json。 1.source-Ma…

Java高频面试之SE-06

hello啊&#xff0c;各位老6&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; 访问修饰符 public、private、protected的区别是什么&#xff1f; 在Java中&#xff0c;访问修饰符用于控制类、方法和变量的访问权限。主要的访…

报表工具DevExpress Reporting v24.2亮点 - AI功能进一步强化

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 报表工具DevExpress Reporting v24.2将于近期发…

每天40分玩转Django:Django表单集

Django表单集 一、知识要点概览表 类别知识点掌握程度要求基础概念FormSet、ModelFormSet深入理解内联表单集InlineFormSet、BaseInlineFormSet熟练应用表单集验证clean方法、验证规则熟练应用自定义配置extra、max_num、can_delete理解应用动态管理JavaScript动态添加/删除表…

MVCC实现原理以及解决脏读、不可重复读、幻读问题

MVCC实现原理以及解决脏读、不可重复读、幻读问题 MVCC是什么&#xff1f;有什么作用&#xff1f;MVCC的实现原理行隐藏的字段undo log日志版本链Read View MVCC在RC下避免脏读MVCC在RC造成不可重复读、丢失修改MVCC在RR下解决不可重复读问题RR下仍然存在幻读的问题 MVCC是什么…

自学记录鸿蒙API 13:实现人脸比对Core Vision Face Comparator

完成了文本识别和人脸检测的项目后&#xff0c;我发现人脸比对是一个更有趣的一个小技术玩意儿。我决定整一整&#xff0c;也就是对HarmonyOS Next最新版本API 13中的Core Vision Face Comparator API的学习&#xff0c;这项技术能够对人脸进行高精度比对&#xff0c;并给出相似…

代码解析:安卓VHAL的AIDL参考实现

以下内容基于安卓14的VHAL代码。 总体架构 参考实现采用双层架构。上层是 DefaultVehicleHal&#xff0c;实现了 VHAL AIDL 接口&#xff0c;并提供适用于所有硬件设备的通用 VHAL 逻辑。下层是 FakeVehicleHardware&#xff0c;实现了 IVehicleHardware 接口。此类可模拟与实…

通过 Ansys Electronics Desktop 中的高级仿真优化 IC 设计

半导体行业继续通过日益复杂的集成电路 (IC) 设计突破技术界限。随着工艺节点缩小和电路密度达到前所未有的水平&#xff0c;电磁效应对设备性能和可靠性变得越来越重要。现代 IC 设计面临着来自复杂的布局相关耦合机制、信号完整性问题和功率分布问题的挑战&#xff0c;这些问…