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 的配置和输出方式。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发中的机器人表情绘制

机器人的表情有两种&#xff0c;一种是贴图&#xff0c;一钟是调用图形API自绘。 贴图效果相对比较好&#xff0c;在存储空间大的情况下是可以采用的。 自绘比较麻烦&#xff0c;但在资源和空缺少的情况下&#xff0c;也是很有用的。而且自绘很容易通过调整参数加入随机效果&…

LLM高性能并行训练技术

LLM高性能并行训练技术 研究背景与意义 深度学习的重要性:人工智能成为国际竞争焦点,深度学习是其核心技术,在众多领域取得突破,推动社会向智能化跃升。面临的挑战:数据、模型规模呈指数级增长,硬件算力发展滞后。单个 GPU 难以满足大规模模型训练需求,分布式训练面临通…

Docker镜像瘦身:从1.43G到22.4MB

Docker镜像瘦身:从1.43G到22.4MB 背景1、创建项目2、构建第一个镜像3、修改基础镜像4、多级构建5、使用Nginx背景 在使用 Docker 时,镜像大小至关重要。我们从 create-react-app (https://reactjs.org/docs/create-a-new-react-app.html)获得的样板项目通常都超过 1.43 GB…

【电路理论四】正弦电流电路

正弦电流 正弦量是随时间按正弦规律变动的电路变量。 随时间按正弦规律变动的电流称为正弦电流。 正弦电流的瞬时值表达式&#xff1a; 称为正弦电流的三要素。 分别为振幅/幅值&#xff0c;角频率&#xff0c;初相。 幅值为正弦电流的最大值&#xff0c;恒为正。 为正弦电…

深度学习使用Anaconda打开Jupyter Notebook编码

新手入门深度学习使用Anaconda打开Jupyter Notebook编码 1. 安装Anaconda 第一种是Anaconda官网下载安装包&#xff0c;但是很慢&#xff0c;不太建议 第二种使用国内清华大学镜像源下载 选择适合自己电脑的版本&#xff0c;支持windows&#xff0c;linux系统 下载完之后自行…

【MySQL】搞懂mvcc、read view:MySQL事务原理深度剖析

前言&#xff1a;本节内容是事务里面最难的一部分&#xff0c; 就是理解mvcc快照读和read view。这两个部分需要了解隔离性里面的四种隔离级别。 博主之前讲过&#xff0c;但是担心友友们不了解&#xff0c; 所以这里开头进行了复习。 下面开始我们的学习吧&#xff01; ps&…

VITUREMEIG | AR眼镜 算力增程

根据IDC发布的《2024年第三季度美国AR/VR市场报告》显示&#xff0c;美国市场AR/VR总出货量增长10.3%。其中&#xff0c;成立于2021年的VITURE增长速度令人惊艳&#xff0c;同比暴涨452.6%&#xff0c;成为历史上增长最快的AR/VR品牌。并在美国AR领域占据了超过50%的市场份额&a…

cuda-cuDnn

cuda sudo /bin/sh cuda_11.7.0_515.43.04_linux.run cudnn cuDNN Archive | NVIDIA Developer Linux 系统 CUDA 多版本共存以及切换 – 颢天 安装cuda # 如果已经安装过驱动&#xff0c;驱动不需要再安装&#xff0c;取消勾选 安装cuDNN&#xff0c;cuda-cuDNN对应关系见…

# 【鸿蒙开发】多线程之Worker的使用

【鸿蒙开发】多线程之Worker的使用 文章目录 【鸿蒙开发】多线程之Worker的使用前言一、Worker的介绍二、注意事项三、Worker使用示例1.新建一个Worker2.主线程使用Worker3.子线程Worker的使用 四、效果展示 前言 本文主要介绍了多线程的方法之一&#xff0c;使用Worker开启多…

Spring Cloud由入门到精通

文章目录 1.初识微服务1.1. 单体架构1.2.分布式架构1.3.微服务1.4 微服务技术比对1.5.Spring Cloud1.6. 总结2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.项目工程结构设计2.2.2.创建Maven项目工程2.3.实现远程调用案例2.3.1.案例需求:2.3.2. 注册 Rest Templ…

电脑缺失libcurl.dll怎么解决?详解电脑libcurl.dll文件丢失问题

一、libcurl.dll文件丢失的原因 libcurl.dll是一个用于处理URL传输的库文件&#xff0c;广泛应用于各种基于网络的应用程序。当这个文件丢失时&#xff0c;可能会导致相关应用程序无法正常运行。以下是libcurl.dll文件丢失的一些常见原因&#xff1a; 软件安装或卸载不完整&a…

XIAO Esp32S3 播放网络Mp3

本文旨在使用XIAO Esp32S3 播放网络Mp3 所需硬件 max98357 接线 Xiao Esp32 S3Max983574LRC5BCLK 6DIN5VVinGNDGND代码: #include "Arduino.h" #include "WiFiMulti.h" #include "Audio.h"// Digital I/O used #def

自动驾驶新纪元:城区NOA功能如何成为智能驾驶技术的分水岭

目录 一、NOA 的定义 二、NOA 的主要特点 导航集成 场景覆盖 智能决策 高级感知能力 驾驶员参与 三、NOA 的优势 四、NOA的衡量指标 定性评价指标 安全性评价指标定义 可靠性评价指标定义 舒适性评价指标定义 通行效率评价指标 定量评价指标 五、代表厂商的实测…

直观解读 JuiceFS 的数据和元数据设计(一)

大家读完觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 JuiceFS 高层架构与组件2 搭建极简 JuiceFS 集群 2.1 搭建元数据集群2.2 搭建对象存储&#xff08;MinIO&#xff09; 2.2.1 启动 MinIO server2.2.2 创建 bucket2.3 下载 juicefs 客户端2.4 创…

如何用jmeter工具进行性能测试

前言 今天我们来说说jmeter如何进行性能测试&#xff0c;我们都知道jmeter工具除了可以进行接口功能测试外&#xff0c;还可以进行性能测试。当项目趋于稳定&#xff0c;根据性能需求就可以着手准备性能测试了&#xff0c;今天就说一说jmeter如何进行性能测试&#xff0c;jmet…

《云原生安全攻防》-- K8s安全配置:CIS安全基准与kube-bench工具

在本节课程中&#xff0c;我们来了解一下K8s集群的安全配置&#xff0c;通过对CIS安全基准和kube-bench工具的介绍&#xff0c;可以快速发现K8s集群中不符合最佳实践的配置项&#xff0c;及时进行修复&#xff0c;从而来提高集群的安全性。 在这个课程中&#xff0c;我们将学习…

Web安全 - “Referrer Policy“ Security 头值不安全

文章目录 概述原因分析风险说明Referrer-Policy 头配置选项1. 不安全的策略no-referrer-when-downgradeunsafe-url 2. 安全的策略no-referreroriginorigin-when-cross-originsame-originstrict-originstrict-origin-when-cross-origin 推荐配置Nginx 配置示例 在 Nginx 中配置 …

《计算机组成及汇编语言原理》阅读笔记:p133-p159

《计算机组成及汇编语言原理》学习第 11 天&#xff0c;p133-p159 总结&#xff0c;总计 27 页。 一、技术总结 1.segment (1)定义 Broadly speaking, a contiguous section of memory. More specifically, a section of memory referenced by one of the segment register…

QT-----------GUI程序设计基础

项目配置文件 .pro文件&#xff1a;这是QT项目的核心配置文件&#xff0c;用于指定项目的名称、版本、源文件、头文件、库文件等信息。例如&#xff1a; QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your comp…

爆改RagFlow

爆改RagFlow 一、Rag理论概述二、Ragflow解析参数说明三、♥ RagFlow源码解析核心代码流程梳理1、OCR识别2、版面分析3、parser功能3.1 PdfParser3.1.1 首先&#xff0c;初始化3.1.2 **pdf转图片** [来自工业界的知识库 RAG 服务(二)&#xff0c;RagFlow 源码全流程深度解析](h…