Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析

文章目录

  • Pre
  • Apache Commons
    • Apache Commons Proper
    • Logging (Apache Commons Logging )
  • JCL 集成logback
    • POM依赖
    • 配置文件 `logback.xml`
    • 使用
  • 源码分析
    • `jcl-over-slf4j` 的工作原理
      • 1. `LogFactory` 的实现
      • 2. `SLF4JLogFactory` 和 `Log` 的实例化过程
      • 3. `SLF4JLog` 和 `SLF4JLocationAwareLog`
      • 4. 日志输出的流程
  • 小结

在这里插入图片描述


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 及 原理分析


Apache Commons

官网:Apache Commons

在这里插入图片描述

Apache Commons Proper

Commons Proper 致力于一个主要目标: 创建和维护可重用的 Java 组件。这 Commons Proper 是一个协作和共享的地方,其中 来自整个 Apache 社区的开发人员都可以 一起讨论由 Apache 项目共享的项目,以及 Apache 用户。

共享资源开发人员将努力确保他们的 组件对其他库的依赖性最小,因此 这些组件可以轻松部署。此外,共享资源 组件将尽可能保持其接口稳定,因此 Apache 用户(包括其他 Apache 项目)可以实现 这些组件。

在这里插入图片描述

组件描述最新 Maven 版本发布版本发布日期
BCEL字节码工程库 - 分析、创建和操作 Java 类文件6.10.06.10.02024-07-23
BeanUtilsJava 反射和 introspection API 的易用封装1.9.41.9.42019-08-13
BSFBean 脚本框架 - 提供对脚本语言的接口,包括 JSR-2233.13.12010-06-24
CLI命令行参数解析器1.9.01.9.02024-08-14
Codec通用的编码/解码算法(例如音标、base64、URL)1.17.11.17.12024-07-15
Collections扩展或增强 Java 集合框架4.5.0-M34.5.0-M32024-12-18
Compress定义用于处理 tar、zip 和 bzip2 文件的 API1.27.11.27.12024-08-20
Configuration用于读取各种格式的配置/偏好文件2.11.02.11.02024-06-10
Crypto一个针对 AES-NI 优化的加密库,包装了 OpenSSL 或 JCE 算法实现1.2.01.2.02023-01-23
CSV处理逗号分隔值文件的组件1.12.01.12.02024-09-25
Daemon为 Unix 守护进程般的 Java 代码提供替代调用机制1.3.41.3.42023-05-12
DBCP数据库连接池服务2.13.02.13.02024-12-02
DbUtilsJDBC 辅助库1.8.11.8.12023-09-14
DigesterXML 到 Java 对象的映射工具3.23.22011-12-13
Email用于从 Java 发送电子邮件的库2.0.0-M12.0.0-M12024-06-27
Exec用于处理外部进程执行和环境管理的 API1.4.01.4.02024-01-05
FileUpload为您的 servlets 和 Web 应用提供文件上传功能1.51.52023-12-27
FileUpload2为您的 servlets 和 Web 应用提供文件上传功能(版本 2)2.0.0-M12.0.0-M12023-07-19
Geometry空间和坐标处理1.01.02021-08-21
Imaging一个纯 Java 图像库(之前称为 Sanselan)1.0.0-alpha51.0.0-alpha52024-04-18
IO一组 I/O 工具类2.18.02.18.02024-11-19
JCIJava 编译器接口1.11.12013-10-14
JCSJava 缓存系统3.2.13.2.12024-05-27
Jelly基于 XML 的脚本和处理引擎1.0.11.0.12017-09-25
Jexl扩展 JSTL 表达式语言的表达式语言3.4.03.4.02024-06-05
JXPath使用 XPath 语法操作 Java Beans 的工具集1.31.32008-08-14
Lang为 java.lang 类提供额外的功能3.17.03.17.02024-08-29
Logging包装了多种日志 API 实现1.3.41.3.42024-08-19
Math轻量级、自包含的数学和统计学组件4.0-beta14.0-beta12022-12-20
Net一组网络工具类和协议实现3.11.13.11.12024-06-10
Numbers数字类型(复数、四元数、分数)和工具(数组、组合数学等)1.21.22024-08-12
Pool通用对象池组件2.12.02.12.02023-09-30
RDFRDF 1.1 的通用实现,可由 JVM 上的系统实现0.5.00.5.02017-12-23
RNG随机数生成器的实现1.61.62024-07-15
SCXMLSCXML 规范的实现,旨在创建和维护 Java SCXML 引擎0.90.92008-12-01
Statistics统计学工具1.11.12024-08-20
TextApache Commons Text 是一个专注于字符串操作的算法库1.13.01.13.02024-12-13
Validator用于在 XML 文件中定义验证器和验证规则的框架1.9.01.9.02024-05-28
VFS虚拟文件系统组件,用于将文件、FTP、SMB、ZIP 等视为一个逻辑文件系统2.9.02.9.02021-07-21
Weaver提供一种简单的方式来增强(织入)已编译的字节码2.02.02018-09-07

Logging (Apache Commons Logging )

https://commons.apache.org/proper/commons-logging/

组件描述最新 Maven 版本发布版本发布日期
Logging包装了多种日志 API 实现1.3.41.3.42024-08-19

JCL 集成logback

在这里插入图片描述

POM依赖

  • jcl-over-slf4j (替代了 commons-logging)
  • slf4j-api
  • logback-core
  • logback-classic

通过 jcl-over-slf4j 替换 commons-logging,从而让 commons-logging 使用 SLF4J 作为底层日志实现。

  <dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>2.0.16</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.16</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.5.15</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.5.15</version></dependency>
  • jcl-over-slf4j:这个依赖项将 commons-logging 的日志请求转发到 SLF4J 框架。
  • slf4j-api:SLF4J 的接口库,负责提供日志记录的 API。
  • logback-corelogback-classic:这是 Logback 的核心和实现,负责具体的日志输出。

配置文件 logback.xml

logback.xml 文件用于定义日志输出的格式和方式。

 <configuration><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} |||  %msg%n</pattern></encoder></appender><!-- 文件输出 --><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>application.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 可选:配置日志文件滚动 --><appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>application.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天滚动日志文件 --><fileNamePattern>application-%d{yyyy-MM-dd}.log</fileNamePattern><!-- 最多保留 30 天的日志文件 --><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 根日志记录器 --><root level="debug"><appender-ref ref="STDOUT" /><appender-ref ref="ROLLING_FILE" /></root><!-- 可选:配置特定包的日志级别 --><logger name="com.artisan" level="info" />
</configuration>

使用

在代码中,通过 commons-logging 的 API 来记录日志,并且通过 SLF4J 和 Logback 完成实际的日志输出。

package com.artisan;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;/***  commons-logging 与 logback 集成**/
public class JclBridgeLogbackExample {// commons logging 的 Log 和  LogFactoryprivate static final Log logger= LogFactory.getLog(JclBridgeLogbackExample.class);public static void main( String[] args ) {logger.trace("JclBridgeLogbackExample This is a trace message");logger.debug("JclBridgeLogbackExample This is a debug message");logger.info("JclBridgeLogbackExample This is an info message");logger.warn("JclBridgeLogbackExample This is a warning message");logger.error("JclBridgeLogbackExample This is an error message");logger.fatal("JclBridgeLogbackExample This is a fatal message");}
}

在这里插入图片描述


源码分析

在这里插入图片描述

jcl-over-slf4j 的工作原理

jcl-over-slf4j 的作用是将 commons-logging 的日志接口(例如 LogLogFactory)转换为 SLF4J 的实现。具体地,它将 commons-logging 的日志请求转发给 SLF4J,而 SLF4J 则可以根据配置选择底层的日志框架(如 logback)。

在这里插入图片描述

  1. 步骤一:将 commons-logging 转向 SLF4J

    • jcl-over-slf4j 提供了一个 LogFactory 类,该类实现了 commons-loggingLogFactory 接口,负责创建 Log 实例。
    • 该类内部,LogFactory 被静态化为 SLF4JLogFactory,即它总是创建 SLF4JLogFactory 的实例,而不再使用 commons-logging 自带的实现。
  2. 步骤二:使用 SLF4J 作为底层日志实现

    • SLF4JLogFactory 内部调用 LoggerFactory.getLogger(name) 来获取 SLF4JLogger 实例。LoggerFactorySLF4J 提供的工厂类,负责返回一个底层日志记录器实例。
    • 一旦获取到 SLF4JLogger 实例,jcl-over-slf4j 将其封装成 commons-logging 定义的 Log 接口的实现,即 SLF4JLogSLF4JLocationAwareLog
    • SLF4JLogSLF4JLocationAwareLog 通过委托的方式将实际的日志调用转发给 SLF4JLogger,而 Logger 决定了最终使用哪个底层日志框架(如 logback)。

1. LogFactory 的实现

jcl-over-slf4j 中,LogFactory 被静态化为 SLF4JLogFactory

public abstract class LogFactory {static LogFactory logFactory = new SLF4JLogFactory();// 其他代码...
}
  • SLF4JLogFactoryLogFactory 的实现,它负责创建 Log 实例。
  • LogFactory.getLog() 方法调用 SLF4JLogFactory 中的 newInstance() 方法来创建 Log 实例。

2. SLF4JLogFactoryLog 的实例化过程

SLF4JLogFactory 实现了 LogFactory 接口,并重写了 newInstance() 方法来创建 Log 对象:

public class SLF4JLogFactory extends LogFactory {public Log newInstance(String name) {Logger slf4jLogger = LoggerFactory.getLogger(name);Log newInstance;if (slf4jLogger instanceof LocationAwareLogger) {newInstance = new SLF4JLocationAwareLog((LocationAwareLogger) slf4jLogger);} else {newInstance = new SLF4JLog(slf4jLogger);}return newInstance;}
}
  • LoggerFactory.getLogger(name) 创建了一个 SLF4JLogger 实例(这背后通常是 logback)。
  • 如果 Logger 实现了 LocationAwareLogger,则会使用 SLF4JLocationAwareLog,它提供了更加详细的日志信息(如日志位置等)。
  • 否则,使用普通的 SLF4JLog 实现。

3. SLF4JLogSLF4JLocationAwareLog

SLF4JLogSLF4JLocationAwareLogLog 接口的实现,它们负责将 commons-logging 的日志方法(如 debug(), info() 等)委托给 SLF4JLogger。这两个类的源码大致如下:

public class SLF4JLog implements Log {private final Logger slf4jLogger;public SLF4JLog(Logger slf4jLogger) {this.slf4jLogger = slf4jLogger;}@Overridepublic void trace(Object message) {slf4jLogger.trace(String.valueOf(message));}@Overridepublic void debug(Object message) {slf4jLogger.debug(String.valueOf(message));}@Overridepublic void info(Object message) {slf4jLogger.info(String.valueOf(message));}// 其他日志级别方法...
}

SLF4JLocationAwareLog 类似,只不过它会获取日志的调用位置(如类名、行号等)以提供更详细的日志信息。

4. 日志输出的流程

  1. 通过 commons-logging API 写日志

    • 使用 commons-logging 提供的 Log 接口进行日志编写(例如 LogFactory.getLog() 获取日志实例)。
    • 调用 trace(), debug(), info() 等方法。
  2. 日志请求转发给 SLF4J

    • jcl-over-slf4j 将这些日志请求转发到 SLF4JLogger 实例。
  3. 最终日志输出

    • SLF4J 根据底层的配置选择具体的日志框架(如 logback),并将日志输出到目标(控制台、文件等)。

小结

  • jcl-over-slf4j 使 commons-logging 可以使用 SLF4J 作为底层日志实现,进而可以通过 SLF4J 配置选择 logback 作为实际的日志框架。
  • LogFactoryLog 被重定向到 SLF4JLogFactorySLF4JLog,这些类将日志请求转发给 SLF4J,而 SLF4J 决定底层日志框架(如 logback)的使用。
  • 这种方式允许我们继续使用 commons-logging API 进行日志记录,而底层的日志实现却是 logback,结合了两者的优势。

在这里插入图片描述

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

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

相关文章

文档大师:打造一站式 Word 报告解决方案1

前言 在政府、医院、银行、财务以及销售等领域&#xff0c;常常需要创建各种报告文件来展开工作汇报&#xff0c;譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工具支持之前&#xff0c;这类报告主要通过 Word 制作&#xff0c;费时费力且难以维护&#…

阿尔萨斯(JVisualVM)JVM监控工具

文章目录 前言阿尔萨斯(JVisualVM)JVM监控工具1. 阿尔萨斯的功能2. JVisualVM启动3. 使用 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff…

<数据集>芝麻作物和杂草识别数据集<目标检测>

数据集下载链接 &#xff1c;数据集&#xff1e;芝麻作物和杂草识别数据集&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90181548数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1300张 标注数量(xml文件个数)&#xff1a;130…

STM32-笔记18-呼吸灯

1、实验目的 使用定时器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;实现呼吸灯效果。 频率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499 利用定时器溢出公式 周期等于频率的倒数。故Tout 1/2KHZ&#xff1b;Ft 72MHZ PSC71&#xff08;喜欢设置成Ft的倍数&…

JVM实战—4.JVM垃圾回收器的原理和调优

大纲 1.JVM的新生代垃圾回收器ParNew如何工作 2.JVM老年代垃圾回收器CMS是如何工作的 3.线上部署系统时如何设置垃圾回收相关参数 4.新生代垃圾回收参数如何优化 5.老年代的垃圾回收参数如何优化 6.问题汇总 1.JVM的新生代垃圾回收器ParNew如何工作 (1)JVM的核心运行原理…

E-commerce .net+React(一)——项目初始化

文章目录 项目地址一、创建.Net环境1.1环境配置1.1.1 使用vscode创建webapi1.1.2 Clean architecture结构创建1.1.3 将创建好结构的项目添加到git里1.1.4 EF Core配置1. 在infrastructure里安装EF所需环境2. 创建Product数据模型3. 创建EF Core的DbContext 数据库上下文4. 创建…

elasticsearch-java客户端jar包中各模块的应用梳理

最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求&#xff0c;现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为&#xff1a;co.elastic.clients:elasticsearch-…

vscode实用插件(持续更新)

目录 Git History Diff Git Graph Error Lens Git History Diff 用于将当前分支的某个文件夹与远程分支的相同文件夹做对比&#xff0c;方便代码评审&#xff01;解决了为了一个问题而多次commit&#xff0c;导致代码不好评审&#xff0c;即不晓得和远程分支相比&#xff0…

full-stack-fastapi-template postgres 管理系统安装指南

full-stack-fastapi-template postgres 管理系统安装指南 本项目基于 full-stack-fastapi-template 模板开发 1. 环境准备 请确保您的系统已安装以下软件&#xff1a; Python 3.9 Node.js 16 PostgreSQL 13 Git Docker (可选&#xff0c;用于容器化部署) 2. 获取代码 # 2.…

Prompt提示工程上手指南(七)Prompt编写实战-基于智能客服问答系统下的Prompt编写

前言 本系列文章从最初的基础原理与入门实践切入&#xff0c;一直延伸到主流策略、引导策略、RAG&#xff08;检索增强生成&#xff09;、思维树&#xff08;ToT&#xff09;与避免幻觉&#xff08;Hallucination&#xff09;的策略这种渐进的结构方便了对初学者和进阶者的双向…

mac系统vsCode中使用Better Comments在.vue文件里失效

问题&#xff1a;关于Better Comments默认在html、TS、JS中有效&#xff0c;在vue中无效,需要单独进行配置 windows系统可以参考友链Better Comments&#xff08;注释高亮&#xff09;在vue文件里失效的问题 关于Better Comments电脑的配置路径&#xff1a; Windows系统&…

mac中idea中英文版本切换

1.快捷键command&#xff0c;或者 2.找到插件&#xff08;plugins&#xff09;&#xff0c;搜索chinese&#xff0c;安装 第一次安装好点击应用会提示重启&#xff0c;直接重启就好了&#xff0c;如果已经安装过&#xff0c;只需要切换中英文 3.中英文切换 外观与行为&#xf…

贝叶斯神经网络(Bayesian Neural Network)

最近在研究贝叶斯神经网络,一些概念一直搞不清楚,这里整理一下相关内容,方便以后查阅。 贝叶斯神经网络(Bayesian Neural Network) 贝叶斯神经网络(Bayesian Neural Network)1. BNN 的核心思想2. BNN 的优化目标3. BNN 的结构与特点4. BNN 的训练过程5. BNN 的优缺点6. …

关于Promise的小测验

关于Promise的小测验 题目 // 编码挑战 #1 /* 在这个挑战中&#xff0c;你将构建一个函数 ‘whereAmI’&#xff0c;该函数仅基于 GPS 坐标显示国家信息。为此&#xff0c;你将使用第二个 API 来对坐标进行地理编码。 以下是你的任务&#xff1a; 第一部分 创建一个函数 ‘whe…

“邂逅”良渚遗址 “巧造”苏绣非遗 《牧神记》焕新有“玄机”

由bilibili与玄机科技联合出品的动画番剧《牧神记》自10月27日上线以来&#xff0c;累计收获了1.2亿播放量、超150万用户追番&#xff0c;B站评分9.7分&#xff0c;多次入选豆瓣口碑华语剧集周榜的动画冠军。放眼今年的国产新番&#xff0c;成绩相当可观。巧妙融合诸多传统元素…

AI文献阅读ChatDOC 、ChatPDF 哪个好?

作为AI产品的深度使用者&#xff0c;基本每天都在使用AI。AI诞生后仿佛给所有的产品打开了新世界大门。当然AI在文献阅读方面自然也不会缺席。 先来简单对比一下ChatDOC vs ChatPDF 从表格里可以看到ChatDOC与ChatPDF都是基于GPT的产品&#xff0c;但在功能上ChatDOC还是比Chat…

Flutter DragTarget拖拽控件详解

文章目录 1. DragTarget 控件的构造函数主要参数&#xff1a; 2. DragTarget 的工作原理3. 常见用法示例 1&#xff1a;实现一个简单的拖拽目标解释&#xff1a;示例 2&#xff1a;与 Draggable 结合使用解释&#xff1a; 4. DragTarget 的回调详解5. 总结 DragTarget 是 Flutt…

Huggingface数据集采样之后得到的arrow文件无法用Dataset.load_from_disk加载解决方法

问题起源 我现在有数据集 我想要采样1/10构成一个新的数据集。起初我只是简单的使用save_to_disk保存&#xff0c;如下代码&#xff1a; from datasets import Dataset import os# 原数据集路径 source_dataset_path "~/.cache/huggingface/datasets/allenai___tulu-3-…

mac中idea菜单工具栏没有git图标了

1.右击菜单工具栏 2.选中VCS&#xff0c;点击添加 3.搜索你要的工具&#xff0c;选中点击确定就添加了 4.回到上面一个界面&#xff0c;选中你要放到工具栏的工具&#xff0c;点击应用就好了 5.修改图标&#xff0c;快捷键或者右击选中编辑图标 6.选择你要的图标就好了

Linux实验报告7-文件管理

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 (1)查看/etc/inittab文件的权限属性&#xff0c;并指出该文件的所有者以及文件所属组群。 (2)新建文件test&#xff0c;设置文件权限为r--r-----。 (3)新建文件test2&#xff0c;设系统中有用户study和用户组studygr…