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.mzph.cn/diannao/65688.shtml

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

相关文章

[算法] [leetcode-349] 两个数组的交集

349 两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a; …

SpringCloudAlibaba实战入门之路由网关Gateway断言(十二)

上一节课中我们初步讲解了网关的基本概念、基本功能,并且带大家实战体验了一下网关的初步效果,这节课我们继续学习关于网关的一些更高级有用功能,比如本篇文章的断言。 一、网关主要组成部分 上图中是核心的流程图,最主要的就是Route、Predicates 和 Filters 作用于特定路…

在Cloudflare Workers上搭建短链接服务

项目地址&#xff1a;https://github.com/xdanielf/ShortLinkCloudflare/ 这个GitHub项目是使用 Cloudflare Workers 构建的简单 URL 缩短器。它可以缩短较长的 URL 并提供丰富的社交媒体共享预览。包括流量分析、统计&#xff0c;缩略名、缩略图设置等等。 将缩短的 URL 重定…

uniapp 微信小程序开发使用高德地图、腾讯地图

一、高德地图 1.注册高德地图开放平台账号 &#xff08;1&#xff09;创建应用 这个key 第3步骤&#xff0c;配置到项目中locationGps.js 2.下载高德地图微信小程序插件 &#xff08;1&#xff09;下载地址 高德地图API | 微信小程序插件 &#xff08;2&#xff09;引入项目…

HALCON中用于分类的高斯混合模型create_class_gmm

目录 一、创建用于分类的高斯混合模型函数二、代码和效果展示三、相关函数 一、创建用于分类的高斯混合模型函数 create_class_gmm( : : NumDim, NumClasses, NumCenters, CovarType, Preprocessing, NumComponents, RandSeed : GMMHandle)create_class_gmm创建用于分类的高斯…

移动 APP 设计规范参考

一、界面设计规范 布局原则&#xff1a; 内容优先&#xff1a;以内容为核心进行布局&#xff0c;突出用户需要的信息&#xff0c;简化页面导航&#xff0c;提升屏幕空间利用率.一致性&#xff1a;保持界面元素风格一致&#xff0c;包括颜色、字体、图标等&#xff0c;使用户在…

【竞技宝】LOL:IG新赛季分组被质疑

北京时间2024年12月31日&#xff0c;今天已经2024年的最后一天&#xff0c;在进入一月之后&#xff0c;英雄联盟将迎来全新的2025赛季。而目前新赛季第一阶段的抽签结果已经全部出炉&#xff0c;其中人气最高的IG战队在本次抽签中抽到了“绝世好签”引来了网友们的质疑。 首先介…

【分布式数据库与数据存储方案】详解

分布式数据库与数据存储方案 一、分布式数据库概述 &#xff08;一&#xff09;概念 分布式数据库是一种将数据分散存储在多个物理节点上的数据库系统&#xff0c;这些节点通过网络进行连接和通信&#xff0c;对外呈现出一个统一的逻辑数据库&#xff0c;用户或应用程序可以像…

AIDD -人工智能药物设计- DrugChat:多模态大语言模型实现药物机制与属性的全方位预测

DrugChat&#xff1a;多模态大语言模型实现药物机制与属性的全方位预测 今天为大家介绍的是来自加州大学圣地亚哥分校谢澎涛团队的一篇论文。准确预测潜在药物分子的作用机制和性质对于推进药物发现至关重要。然而&#xff0c;传统方法通常需要为每个特定的预测任务开发专门的…

整合版canal ha搭建--基于1.1.4版本

开启MySql Binlog&#xff08;1&#xff09;修改MySql配置文件&#xff08;2&#xff09;重启MySql服务,查看配置是否生效&#xff08;3&#xff09;配置起效果后&#xff0c;创建canal用户&#xff0c;并赋予权限安装canal-admin&#xff08;1&#xff09;解压 canal.admin-1…

升级Cypress到10.8.0

目录 错误信息1&#xff1a;Error: Webpack Compilation Error✔ 代码 错误信息2&#xff1a; 执行测试后&#xff0c;异常退出&#xff0c;没有报错✔ 错误信息3&#xff1a; 执行测试后&#xff0c;报Webpack Compilation Error&#xff0c; webpack找不到✔ 错误信息4&a…

WebRTC音视频通话系统需求(项目预算)

项目预算 开发成本 人力成本 项目经理&#xff1a;&#xffe5;50,000技术负责人&#xff1a;&#xffe5;40,000开发工程师&#xff08;3人&#xff09;&#xff1a;&#xffe5;120,000测试工程师&#xff08;2人&#xff09;&#xff1a;&#xffe5;80,000运维工程师&…

es单机安装脚本自动化

背景 所有部署工作都可以由机器本身完成,并不需要人的参与,人唯一需要做的是把变量提取出来,进行赋值喂给脚本,然后脚本自己执行即可。下边是es单机安装的过程和脚本,由人变到脚本执行,方便理解。 步骤 1、解压es软件tar包。 2、cd至解压以后得config目录下,vim修改…

论文实现:Reactive Nonholonomic Trajectory Generation via Parametric Optimal Control

1. 多项式螺旋 曲率&#xff1a; κ ( s ) a 0 a 1 s a 2 s 2 a 3 s 3 a 4 s 4 a 5 s 5 \begin{align} \kappa(s) a_0 a_1s a_2s^2 a_3s^3 a_4s^4 a_5s^5 \end{align} κ(s)a0​a1​sa2​s2a3​s3a4​s4a5​s5​​ 机器人朝向&#xff1a; θ ( s ) a 0 s a 1…

基于ST的VIPERGAN65和SRK1004的65W QR USB PD适配器参考设计

一&#xff1a;评估板STDES-VIPGAN65F介绍 STDES-VIPGAN65F是一款65w USB Type-C3.0电源适配器参考设计。它是一个带有独立USB PD控制器的隔离电源。评估板在初级侧实现了准谐振反激电路&#xff0c;这个转换器基于意法半导体的VIPerGaN高压转换器VIPERGAN65并带有光耦合器反馈…

遥感图像车辆检测-目标检测数据集

遥感图像车辆检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接: https://pan.baidu.com/s/1XVlRTVWpXZFi6ZL_Xcs7Rg?pwdaa6g 提取码: aa6g 数据集信息介绍&#xff1a; 共有 1035 张图像和一一对应的标注文件 标注文件格式提供了…

低空经济新动力:无人机航测技术的普及与应用

在低空经济的快速发展背景下&#xff0c;航空测绘&#xff08;简称航测&#xff09;技术的应用日益广泛&#xff0c;它为城市规划、农业监测、环境评估等领域提供了重要支撑。随着技术的进步和成本的降低&#xff0c;航测技术正逐渐从专业领域走向平民化&#xff0c;这不仅为低…

Django 中数据库迁移命令

在 Django 中&#xff0c;python manage.py makemigrations、python manage.py sqlmigrate polls 0003 和 python manage.py migrate 是与数据库迁移相关的重要命令。它们的作用和对应内容如下&#xff1a; 1. python manage.py makemigrations 功能: 此命令会根据你的模型文…

基于 Spring AI 孵化一款 AI 产品

最近收到很多粉丝的私信&#xff0c;疑问最多的就是为何我们团队最近很少更新内容&#xff1f;首先非常感谢大家对腾飞开源团队的关注和支持&#xff0c;其实我们团队最近3个月一直在做一件事情&#xff1a;孵化一款 AI 产品。 一、引言 我们目睹了一场前所未见的技术革命——…

【漫话机器学习系列】029.累积分布函数(Cumulative Distribution Function)

累积分布函数&#xff08;Cumulative Distribution Function, CDF&#xff09; 累积分布函数&#xff08;CDF&#xff09;是概率论和统计学中的一个基本概念&#xff0c;用于描述随机变量取值的累积概率分布情况。它在理论研究和实际应用中广泛使用。 定义 给定随机变量 X&am…