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

文章目录

  • 官网
  • 集成Jdk_logging步骤
    • POM依赖
    • 使用
  • 原理分析
    • SLF4J 与 JUL 的集成
    • 获取 `ILoggerFactory` 的过程
    • 根据 `ILoggerFactory` 获取 `Logger` 实例的过程
  • 小结

在这里插入图片描述


官网

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

在这里插入图片描述


集成Jdk_logging步骤

在这里插入图片描述

POM依赖

SLF4J 与 JDK 日志(JUL)集成需要以下依赖:

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

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>2.0.16</version>
        </dependency>
  • slf4j-api: SLF4J 的核心 API。
  • slf4j-jdk14: SLF4J 与 JDK 自带日志(JUL)的适配器,允许 SLF4J 日志调用转发到 java.util.logging
    在这里插入图片描述

使用

使用 SLF4J 记录日志,但实际输出通过 JDK 自带的 java.util.logging.Logger 实现:

 package com.artisan;


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

/**
 *
 * slf4j 与 jdk-logging 集成
 */
public class Slf4jJdkLogging {

    private static final Logger logger= LoggerFactory.getLogger(Slf4jJdkLogging.class);

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

}

输出的日志将显示为:

在这里插入图片描述

虽然代码使用了 SLF4J 的 API (LoggerLoggerFactory),但实际的日志输出是通过 JDK 自带的 java.util.logging.Logger 完成的。


原理分析

SLF4J 与 JUL 的集成

slf4j-jdk14 包中,org/slf4j/impl/StaticLoggerBinder.class 类是关键,它负责将 SLF4J 与 JDK 日志(JUL)集成。StaticLoggerBinder 类的作用是为 SLF4J 提供底层日志框架的绑定。对于 slf4j-jdk14StaticLoggerBinder 类返回的 ILoggerFactory 类型是 JDK14LoggerFactory

private StaticLoggerBinder() {
    loggerFactory = new org.slf4j.impl.JDK14LoggerFactory();
}

获取 ILoggerFactory 的过程

由于类路径下存在 StaticLoggerBinder 类,SLF4J 会选择 slf4j-jdk14 中的 StaticLoggerBinder 来创建一个单例对象并返回 ILoggerFactory 实例。StaticLoggerBinder 中的 ILoggerFactoryJDK14LoggerFactory,它负责创建 SLF4J 定义的 Logger 实例。

private static final ILoggerFactory loggerFactory;

根据 ILoggerFactory 获取 Logger 实例的过程

JDK14LoggerFactory 实现了 ILoggerFactory 接口,负责返回一个 SLF4J 定义的 Logger 实例。具体来说,JDK14LoggerFactory 使用 JDK 自带的 java.util.logging.Logger 来创建日志实例,并通过 JDK14LoggerAdapter 将其包装成 SLF4J 的 Logger 实现。

java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger(name);
Logger newInstance = new JDK14LoggerAdapter(julLogger);
  • java.util.logging.Logger.getLogger(name) 创建了一个标准的 JDK 日志记录器实例。
  • JDK14LoggerAdapter 是 SLF4J 为 JDK 日志提供的适配器,它实现了 SLF4J 的 Logger 接口,并将日志请求委托给 JDK 的日志记录器。

最终,SLF4J 的 Logger 实例实际上是一个 JDK14LoggerAdapter,该适配器会将 SLF4J 日志调用转发到 JDK 自带的日志实现。


小结

  • SLF4J 通过 slf4j-jdk14 包与 JDK 自带的日志(JUL)进行集成。StaticLoggerBinder 类在类路径中负责将 SLF4J 与 JDK 日志框架绑定。
  • JDK14LoggerFactoryILoggerFactory 的实现,它负责创建 JDK14LoggerAdapter,后者包装了 java.util.logging.Logger 并将其作为 SLF4J 的 Logger 实例使用。
  • 日志调用最终通过 JDK14LoggerAdapter 转发到 JDK 自带的 java.util.logging.Logger

在这里插入图片描述

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

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

相关文章

爆肝1个月:DDR4 的信号完整性(万字长文SI)

前言&#xff1a; 大学里面&#xff0c;总有很多课程&#xff0c;很浪费时间&#xff0c;学了没点用处&#xff0c;问过老师&#xff0c;为什么信号完整性&#xff0c;示波器使用等课程不开呢&#xff0c;这种是对工作真实有帮助的&#xff1f; 老师&#xff1a;因为老师…

一文详解MacOS+CLion——构建libtorch机器学习开发环境

对于希望在本地环境中进行深度学习开发的开发者来说&#xff0c;配置合适的工具链是至关重要的一步。本文旨在帮助您在 macOS 操作系统上&#xff0c;利用 CLion IDE 和 PyTorch 的 C依赖库——libtorch&#xff0c;快速搭建起一个高效的开发环境。这里我们将一步步地讲解如何下…

pg数据库postgis扩展相关技术简介

postgis-note pg数据库postgis扩展相关技术简介 简介 PostGIS是在对象关系型数据库PostgreSQL上增加了存储管理空间数据的能力的开源GIS数据库。依托于PostgreSQL的两个重要特性&#xff1a;Geometry对象、Gist索引。 webgis技术路线 Geometry对象 Geometry&#xff08;几…

Html——10 关键字和描述

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>淘宝网</title><meta name"keywords" content"我要自学网,自学HTML,自学CSS"/><meta name"description" content"要设置…

【原创学习笔记】近期项目中使用的西门子V20变频器总结(上篇)

现场V20 22kW变频器如图所示 进线分别为L1,L2,L3,PE线&#xff0c;出现分别为U,V,W接电机 在西门子官网查询手册后&#xff0c;查询可知可以通过多种方式控制变频器&#xff0c;比如&#xff1a;面板&#xff08;BOP&#xff09;控制&#xff0c;端子&#xff08;NPN/PNP&…

Exchange ProxyShell 攻击链利用详解

目录 ProxyShell CVE-2021-34473 SSRF ProxyShell 详细复现 ProxyShell 一键利用脚本 攻击者利用 ProxyShell 漏洞可绕过相关权限验证,进而配合其他漏洞可执行任意代码,控制Microsoft Exchange Server。 ProxyShell攻击链利用使用了以下漏洞: CVE-2021-34473 一个 SSR…

算法练习——模拟题

前言&#xff1a;模拟题的特点在于没有什么固定的技巧&#xff0c;完全考验自己的代码能力&#xff0c;因此有助于提升自己的代码水平。如果说一定有什么技巧的话&#xff0c;那就是有的模拟题能够通过找规律来简化算法。 一&#xff1a;替换所有问号 题目要求&#xff1a; 解…

ES 磁盘使用率检查及处理方法

文章目录 1. 检查原因2. 检查方法3. 处理方法3.1 清理数据3.2 再次检查磁盘使用率 1. 检查原因 磁盘使用率在 85%以下&#xff0c;ES 可正常运行&#xff0c;达到 85%及以上会影响 PEIM 数据存储。 在 ES 磁盘分配分片控制策略中&#xff0c;为了保护数据节点的安全&#xff0…

leetcode 面试经典 150 题:螺旋矩阵

链接螺旋矩阵题序号54题型二维数组&#xff08;矩阵&#xff09;解题方法模拟路径法难度中等熟练度✅✅✅ 题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3…

汽车CAN通信逻辑与LabVIEW开发

CAN通信的核心概念 CAN&#xff08;Controller Area Network&#xff09;是一种多主通信协议&#xff0c;广泛应用于汽车电子系统中&#xff0c;用于控制单元之间的高效通信。 ​ 消息优先级&#xff1a;每个CAN帧包含唯一的标识符&#xff08;ID&#xff09;&#xff0c;ID的…

CI/CD是什么?

CI/CD 定义 CI/CD 代表持续集成和持续部署&#xff08;或持续交付&#xff09;。它是一套实践和工具&#xff0c;旨在通过自动化构建、测试和部署来改进软件开发流程&#xff0c;使您能够更快、更可靠地交付代码更改。 持续集成 (CI)&#xff1a;在共享存储库中自动构建、测试…

Kubernetes之NodeSelector与NodeName实战

目录 目标 版本 官网 概述 实战 NodeName实战 NodeSelector实战 目标 通过配置NodeSelector与NodeName实现Pod运行&#xff08;或优先运行&#xff09;在我们期望的节点之上。了解这两种实现方法的区别。 版本 Kubernets v1.25.0 官网 将Pod分配给节点https://kubernet…

如何构建有效的AI Agents:从复杂到简约——深度解读Claude实践总结《Building effective agents》(上)

在人工智能技术日新月异的今天&#xff0c;大语言模型(LLM)已经成为技术创新的热点。 然而&#xff0c;在追逐技术前沿的热潮中&#xff0c;我们是否忽视了工程设计的本质&#xff1f; 作为全球人工智能领域的领军企业之一&#xff0c;Anthropic以其在AI安全和伦理方面的深入…

高中数学刷题版:函数奇偶性[干货]

文章目录 一、奇偶性定义例题 二、运算性质1、两个函数的和差积商2、复合函数3、画草图4、对称中心与对称轴 三、奇偶性判断例题 四、根据奇偶性求解析式例题 五、单调性与奇偶性的综合应用例题 一、奇偶性定义 1、定义域都是关于原点对称。 2、解析式关系 奇函数&#xff1a;…

【Sentinel】流控效果与热点参数限流

目录 1.流控效果 1.1.warm up 2.2.排队等待 1.3.总结 2.热点参数限流 2.1.全局参数限流 2.2.热点参数限流 2.3.案例 1.流控效果 在流控的高级选项中&#xff0c;还有一个流控效果选项&#xff1a; 流控效果是指请求达到流控阈值时应该采取的措施&#xff0c;包括三种&…

【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.4.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例&#xff1a; m…

集装箱的纸箱和塑料箱识别数据集,使用YOLO,COCO JSON,PASICAL VOC XML格式标注,识别准确率高达97.5%

集装箱的纸箱和塑料箱识别数据集&#xff0c;使用YOLO&#xff0c;COCO JSON&#xff0c;PASICAL VOC XML格式标注&#xff0c;识别准确率高达97.5% 数据集分割 训练组88&#xff05; 4605图片 有效集8% 438图片 测试集4% 219图片 预处理 自动定向&#x…

TOP K问题:利用堆排序找出数组中最小的k个数

设计一个算法&#xff0c;找出数组中最小的k个数。以任意顺序返回这k个数均可。 找小的数需要建大堆来解决&#xff0c;首先将数组中前K个数建成一个大堆&#xff0c;将从k1个数直到数组结束的所有数与堆顶的数进行比较&#xff0c;如果比堆顶的数小&#xff0c;则替换堆顶的数…

VDA 学习手册

VDA&#xff08;Verband der Automobilindustrie&#xff0c;德国汽车工业联合会&#xff09;报文标准是专为汽车行业制定的电子数据交换&#xff08;EDI&#xff09;标准&#xff0c;用于支持供应链管理中的数据传输。它是由德国汽车工业联合会开发和维护的&#xff0c;广泛应…

自动化测试- 自动化测试模型

目录 自动化测试模型简介 1、线性模型 举例 测试页面html文件 测试脚本 2. 关键字驱动测试&#xff08;Keyword-Driven Testing&#xff09; 需测试内容 关键字驱动测试框架 创建测试用例文件 运行测试 3. 数据驱动测试&#xff08;Data-Driven Testing&#xff09; …