JCL-Over-SLF4J+SLF4J+Logback 使用方式

log4j-over-slf4j的jar包适配原理解析 如果想把项目中的日志实现统一成slf4j的话,则需要把第三方一些依赖包中的日志包去掉,例如Spring中的jcl,或者其他的像早期的log4j,如果直接排除,则程序肯定会运行报错,此时需要引入适配包,这个适配包就是一个狸猫换太子包,这个包有着和jcl和log4j一摸一样的包名和类名,所以在程序动态运行过程中,只需要关心classpath下有没有这个类即可,并不需要知道这个类在哪个jar包,正因如此,才能实现狸猫换太子的功能。下面写一个测试程序:最开始是先有的jcl这个包,然后这个包中依赖log4j这个包,在 阅读详情

我们前面已经讲过了 SLF4J 的两种用法:SLF4J+Log4J  和 SLF4J+Logback,那是在比较理想的情况下,所用组件只使用了 SLF4J 这一种统一日志框架的时候。可是 JCL 一直影响深远,SLF4J 渐入佳境的时个,在你的项目中很可能所用的组件,它们分别用了 JCL 和 SLF4J 两种组件。比如说在项目中用了 Hibernate 3.5 和 Struts,或其他 Apache 的一些开源组件,你大约也不想用了 SLF4J 的组件日志信息输出到 A 处,用了 JCL 的组件日志输出到 B 处,那你自己写的代码中的日志信息该往哪儿写呢?

中国人一直都愿追求大一统,不喜欢城邦制的便于分而治之。但说到日志输出还是得统一到单一通道中来,一方面多个通道浪费资源,另方面也便于配置和管理。那么既然 SLF4J 是趋势,当 SLF4J 和 JCL 被丢到一个坛子里,首先会让 SLF4J 为主,JCL 为辅,也就是要把 JCL 桥接到 SLF4J 上来,通过 SLF4J 统一输出日志信息。于是也就是这篇要介绍的 SLF4J 使用模式:JCL-Over-SLF4J+SLF4J。

从前面对 SLF4J 的认识可知,即使把 JCL 转嫁到 SLF4J,还是无法输出日志,还需要一种日志实现,下层该用 Log4J 还得用 Log4J,想用 Logback 还是要用 Logback。所以到了 SLF4J 后还得往下走,也就是前面那两条路 SLF4J+Log4J 和 SLF4J+Logback,本篇使用 SLF4J 的模式具体就要分为:

JCL-Over-SLF4J+SLF4J+Log4J 和 JCL-Over-SLF4J+SLF4J+Logback,这两种实现方式差不多。只是分别用的 jar 包和配置文件不同,SLF4J+Log4J 和 SLF4J+Logback 原来要哪些文件现在还是需要那些文件,只是都要加上 jcl-over-slf4j-1.5.11.jar 包。这里说明 JCL-Over-SLF4J+SLF4J+Logback 的方式。

需要的配置文件和组件包,下面四个 jar 文件和一个 xml文件都是要放在项目的 ClassPath 上。

1. slf4j-api-1.5.11.jar
2. logback-core-0.9.20.jar
3. logback-classic-0.9.20.jar
4. logback.xml 或 logback-test.xml
5. jcl-over-slf4j-1.5.11.jar

第 1 和第 5 个包在 http://www.slf4j.org/download.html 处下载,第二第三个包在 http://logback.qos.ch/download.html 下载,可能包文件名中的版本号有些差异。

下面是一个最简单的 logback.xml 文件内容

01
02
03
04
05
06
07
08
09
10
11
12
<? xml version = "1.0" encoding = "UTF-8" ?>
< configuration >
   < appender name = "stdout" class = "ch.qos.logback.core.ConsoleAppender" >
       < encoder charset = "GBK" >
           < pattern >[Consociate] %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</ pattern >
       </ encoder >
   </ appender > 
 
   < root level = "DEBUG" >
     < appender-ref ref = "stdout" />
   </ root >
</ configuration >

为了看看效果,我们在输入的 pattern 中加入了 [Consociate],来检验是否统一到单一的日志通道中去了。

使用 了 JCL 和 SLF4J  的代码

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package com.unmi;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class TestJCLOverSlf4j {
     //SLF4J 的 Logger
     private static final Logger logger = LoggerFactory.getLogger( "From SLF4J" );
 
     //JCL 的 Log
     private static final Log log = LogFactory.getLog( "From JCL" );
 
     //分别用上面的 logger 和 log 输出日志,从输出可以看到它们统一到一个通道中了
     public static void main(String[] args) {
         logger.info( "Hello {}" , "From SLF4J" );
         log.info( "Hello From JCL" );
     }
}

我们在上面代码中,既使用了 JCL 统一日志框架,也使用了 SLF4J 的统一日志框架。要注意一点,从 JCL 桥接过来的 log 不能输出参数化消息了。上面代码使用了 org.apache.commons.logging.Log,import org.apache.commons.logging.LogFactory,但你却用不着引入 commons-logging.jar 包。

执行上面的代码,看到输出:

[Consociate] 23:19:39.890 [main] INFO  From SLF4J - Hello From SLF4J
[Consociate] 23:19:39.921 [main] INFO  From JCL - Hello From JCL

很明显示 JCL 框架和 SLF4J 框架的日志输出都统一到了一个通道中来了,为什么呢? SLF4J 使用的是 Logback 输出的信息,这一点没问题的,而 JCL 是不认识 Logback 的,所以 JCL 框架的输出必然是绕道到 SLF4J,最后也是由 Logback 输出的。

实现分析:

我们打开 jcl-over-slf4j-1.5.11.jar,看到里面有两个包 org.apache.commons.logging 和 org.apache.commons.logging.impl,并有相应的类,这就是为什么,虽然在代码中有:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

却不用把 commons-logging.jar 包引入到类路径上的原因。

再深入下 jcl-over-slf4j-1.5.11.jar,看到其中还有个文件 /META-INF/services/org.apache.commons.logging.LogFactory,内容为:

org.apache.commons.logging.impl.SLF4JLogFactory

# Axis gets at JCL through its own mechanism as defined by Commons Discovery, which
# in turn follows the instructions found at:
# http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Service Provider

JCL 运行时使用了 SLF4JLogFactory,从而完成了 JCL 的日志实现委托给了 SLF4J,再由 SLF4J 进一步完成具体的日志输出。

采用 JCL-Over-SLF4J+SLF4J+Log4J 使用模式也是相似的,这里就不详述了。总结下就是 JCL 把 SLF4J 当作它的日志实现。

再来想象个问题:如果我们把这两个包 jcl-over-slf4j-1.5.11.jar 和 slf4j-jcl-1.5.11.jar 都放到 ClassPath 下会有什么情况呢?JCL 代理给 SLF4J,SLF4J 又绑定到 JCL,对了,死循环,StackOverFlow 错误:

SLF4J: Detected both jcl-over-slf4j.jar AND slf4j-jcl.jar on the class path, preempting StackOverflowError.
SLF4J: See also 
http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
java.lang.ExceptionInInitializerError
at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:82)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:51)
at org.slf4j.LoggerFactory.getSingleton(LoggerFactory.java:230)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:121)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:112)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:275)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:248)
at com.unmi.TestJCLOverSlf4j.<clinit>(TestJCLOverSlf4j.java:10)
Caused by: java.lang.IllegalStateException: Detected both jcl-over-slf4j.jar AND slf4j-jcl.jar on the class path, preempting StackOverflowError. See also
http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
at org.slf4j.impl.JCLLoggerFactory.<clinit>(JCLLoggerFactory.java:64)
... 8 more
Exception in thread "main"

带你理清 Java 混乱的日志体系 - log4j、logback、log4j2、jcl、SLFJ 究竟是啥关系? Java混乱的日志体系 Java日志体系概述 常用的日志组成方案与应用场景 目前最优的方案:slf4j的异步模式+log4j2,性能好 例如,springboot+mybatis+slf4j+log4j2 jcl本来就是抽象的,slf4j能桥接jcl,是为了能够适配。 日志切换,适配器 JCL slf4j +jcl 或其它 序列化 ... 阅读详情

相关推荐

Java日志管理不再是问题 - JCL日志重定向到SLF4J日志【案例】

深入了解SLF4J替换掉JCL日志的底层原理,以后Java日志管理问题排查将不是问题。

甘蓝的专栏 426

jcl-over-slf4j log桥接工具简介

ava 界里有许多实现日志功能的工具,最早得到广泛使用的是 log4j,许多应用程序的日志部分都交给了 log4j,不过作为组件开发者,他们希望自己的组件不要紧紧依赖某一个工具,毕竟在同一个时候还有很多其他很多日志工具,假如一个应用程序用到了两个组件,恰好两个组件使用不同的日志工具,那么应用程序就会有两份日志输出了。   为了解决这个问题,Apache Commons Logging (之前叫...

weixin_33951761的博客 275

jcl-over-slf4j-1.6.1.jar

jcl-over-slf4j-1.6.1.jar

log桥接工具jcl-over-slf4j使用(项目排除commons-logging依赖的影响)

1、多日志实现组件存在问题java世界里有许多实现日志功能的工具,最早得到广泛使用的是 log4j,许多应用程序的日志部分都交给了 log4j,不过作为组件开发者,他们希望自己的组件不要紧紧依赖某一个工具,毕竟在同一个时候还有很多其他很多日志工具,假如一个应用程序用到了两个组件,恰好两个组件使用不同的日志工具,那么应用程序就会有两份日志输出了。2、解决多日志实现组件问题,引入JCL为了解决这个问题,

javaloveiphone的专栏 2万+

jcl-over-slf4j-1.7.21-API文档-中文版.zip

赠送jar包:jcl-over-slf4j-1.7.21.jar; 赠送原API文档:jcl-over-slf4j-1.7.21-javadoc.jar; 赠送源代码:jcl-over-slf4j-1.7.21-sources.jar; 包含翻译后的API文档:jcl-over-slf4j-1.7.21-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:org.slf4j,artifactId:jcl-over-slf4j,version:1.7.21 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

jcl-over-slf4j-1.7.25-API文档-中文版.zip

赠送jar包:jcl-over-slf4j-1.7.25.jar; 赠送原API文档:jcl-over-slf4j-1.7.25-javadoc.jar; 赠送源代码:jcl-over-slf4j-1.7.25-sources.jar; 赠送Maven依赖信息文件:jcl-over-slf4j-1.7.25.pom; 包含翻译后的API文档:jcl-over-slf4j-1.7.25-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.slf4j:jcl-over-slf4j:1.7.25; 标签:slf4j、jcl、over、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

[转]JCL-Over-SLF4J+SLF4J+Logback 使用方式

我们前面已经讲过了 SLF4J 的两种用法:SLF4J+Log4J  和 SLF4J+Logback,那是在比较理想的情况下,所用组件只使用了 SLF4J 这一种统一日志框架的时候。可是 JCL 一直影响深远,SLF4J 渐入佳境的时个,在你的项目中很可能所用的组件,它们分别用了 JCL 和 SLF4J 两种组件。比如说在项目中用了 Hibernate 3.5 和 Struts,或其他 Apac...

CurrentJ 771

【Creo】关于Creo一换网络就报错许可证丢失问题解决方案

依照我的个人理解,Creo只要一更换网络,则其许可证里面的网卡参数和现在的网络就对不上了,所以就会出现报错,并且有可能是报错代码(-9),提示许可证激活有问题。

weixin_52002180的博客 6042

日志框架知识 commons-logging log4j slf4j logback java.util.logging

commons-logging是apache最早提供的日志的门面接口,记住这是定义的接口,使用者可以使用不同的日志实现,面向接口编程,如果需要更换具体的实现,成本很低。log4j这是具体的日志实现,最经典的日志组件,不过目前使用的越来越少。slf4j这也是日志的门面接口,是目前比较流行的日志门面组件。logback具体日志的实现,目前使用比较广泛,是log4j的作者又一顶力之作,性能较log4j有较大提升。...

whieenz的专栏 493

基于ARDUINIO的5路红外循迹小车

基于ARDUINIO的5路红外循迹小车 新手抄袭了很多大神的代码。这里表示感谢。 #define STOP 0 #define FORWARD 1 #define BACKWARD 2 #define STURNLEFT 3 #define STURNRIGHT 4 #define TURNLEFT 5 #define TURNRIGHT 6 #define TURNRIGHT90 7 #define TURNLEFT90 8 int leftA_PIN = A0; int

weixin_48214416的博客 4382

四阶龙格库塔方法求解一次常微分方程组

四阶龙格库塔方法求解一次常微分方程组一、写在前面二、四阶龙格库塔方法三、使用四阶龙格库塔方法求解一次常微分方程组 一、写在前面 龙格库塔方法是数值求解常微分非线性方程的有利工具,计算精度较高,通过缩短步进距离和增加阶数可以进一步控制误差范围。工程上较为常用的是四阶龙格库塔算法(R-K4),在计算收敛的情况下往往可以得到比较好的结果。 二、四阶龙格库塔方法 这里简单介绍一下算法的具体实现过程,不做详细的推导。其求解的问题是形如方程: y˙=f(y,t),其中t∈[t0,t1]初值y(t0)=c0 \dot{y

HelloWorldTM的博客 2万+

java日志系统

1、初始:Spring 使用 commons-logging 日志包。 2、自定义: ① 加入 slf4j+logback <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </dependency> <depe

Evildoer__的博客 547

ANSYS HFSS 中的相控天线阵列仿真方法

相控天线阵列系统广泛使用,从国防雷达应用到商业 5G 应用。设计这些天线阵列涉及复杂的数学运算,需要全波仿真。Ansys HFSS 全场 3D 电磁仿真软件可以在合理的时间内以较低的计算成本仿真复杂的相控阵天线系统,同时考虑复杂激励、环境(即附近的天线)和平台对其性能的影响。本博客介绍了可用于有效仿真相控天线阵列的不同方法。以下是不同仿真方法的简要概述,视频链接中提供了完整的演示。ANSYS HFSS 提供 4 种不同的相控天线阵列仿真方法:1) 晶胞-无限阵列。

jkh920184196的博客 4260

JCL 和 SLF4J

log JCL SLF4J SLF4J 导入依赖

weixin_45729272的博客 532

VisionMaster4.3.0+C#开发环境搭建实战:如何快速跑通第一个视觉检测demo?

本文详细介绍了海康VisionMaster 4.3.0机器视觉平台与C#的开发环境搭建实战。从软件安装、示例程序导入、解决NuGet包冲突,到配置并成功运行第一个视觉检测Demo,提供了完整的步骤指南和常见问题排查方法,帮助开发者快速上手二次开发。

weixin_29219189的博客 406

ThingsBoard集群部署之k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 1176

Java日志体系框架总结:JUL、JCL、SLF4J、Log4j、Logback、Log4j2

Java日志概述、日志级别Level、Java Util Logging、JULI、tomcat-juli、tomcat-embed-logging-juli、Jakarta Commons Logging、Apache Commons Logging、SLF4J、静态绑定、桥接、SLF4J vs Commons Logging;Log4j、GAV变更;Logback、性能对比;Log4j2、性能对比、原理;实战:Log4j、Logback、Lombok。 问题:程序包org.slf4j不存在、ClassN

lonelymanontheway的博客 1538

华为OD机试真题 新系统2026-04-15 Python&JS 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 525

Commons-Logging、Jcl-over-Slf4j、Slf4j、Logback 类图

#mermaid-svg-gvqtZeYzAnDNkmbJ .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-gvqtZeYzAnDNkmbJ .label text{fill:#333}#mermaid-svg-gvqtZeYzAnDNkmbJ .node rect,#mermaid-svg-gvqtZeYzAn

jilindaxue的博客 265

杰理AC696N系列芯片外部中断使用教程

本教程详细介绍了杰理AC696N芯片的GPIO引脚中断唤醒功能实现方法。主要内容包括: 功能特点: 支持任意GPIO引脚配置为中断源 可灵活选择上升沿或下降沿触发 提供自定义中断回调函数接口 核心实现: 通过port_wkup_interrupt_init()函数配置GPIO属性 使用request_irq()注册中断服务程序 提供中断使能/关闭接口 注意事项: 此功能在低功耗模式下无效 需注意引脚冲突和中断优先级设置 建议在回调函数中实现简洁的逻辑 应用场景: 按键检测 外部信号监测 事件触发等 本方案提

qq_42014563的博客 944

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

替换spring的commons-logging(jcl)日志系统为logback日志系统

接口层名称 说明 JCL(Jakarta Commons Logging) 陈旧,这个就是spring-core依赖的logging SLF4J 适合(同一作者) jboss-logging 特殊专业领域使用 实现层名称 说明 log4j 最初版(同一作者) JUL(java.util.logging) JDK自带,因为jdk不是专业做日志的,所以比较简易 log4j2 Apache收购log4j后全面重构,内部实现和log4j完全不同 logback...

技术积累,技术分享 4581

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

org.slf4j.LoggerFactory#getLogger 源码解析(含 log4j 和 logback )

我们使用日志系统的时候非常简单 LoggerFactory.getLogger就可以搞定一切 那么你了解这简单背后的设计和实现吗? 你知道Slf4j是如何发现日志系统的底层实现的吗? 你了解LoggerFactory、LoggerContext、Logger之间的关系吗? 你知道Log4j和Logback实现之间的差异吗? 请走进日志系统的世界……

ttyy1112的专栏 4800

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

slf4j、jcl、jul、log4j1、log4j2、logback大总结

slf4j、jcl、jul、log4j1、log4j2、logback大总结 转自:http://my.oschina.net/pingpangkuangmo/blog/410224#OSC_h2_22 1 系列目录 2各种jar包总结 3集成总结 3.1 commons-logging与其他日志框架集成 3.2 slf4j与其他日志框架集成 4 日志系统之间的切换 4.1 l...

jybzjf的专栏 683

SLF4J桥接器完全指南:无缝迁移JCL和log4j到现代日志系统

在Java开发中,日志系统的选择和迁移常常是项目维护的一大挑战。SLF4J(Simple Logging Facade for Java)作为日志门面框架,通过提供桥接器(如jcl-over-slf4j和log4j-over-slf4j),让开发者能够轻松将老旧的JCL(Jakarta Commons Logging)和log4j日志系统迁移到现代日志实现,无需大规模修改代码。本文将详细介绍如何利

gitblog_00212的博客 397

slf4j、jcl、jul、log4j1、log4j2、logback大总结[转]

slf4j、jcl、jul、log4j1、log4j2、logback大总结[转] #1 系列目录 jdk-logging、log4j、logback日志介绍及原理 commons-logging与jdk-logging、log4j1、log4j2、logback的集成原理 slf4j与jdk-logging、log4j1、log4j2、logback的集成原理 slf4j、jcl、ju...

兜兜里全是糖_博客 400
上一篇: SLF4J 的几种实际应用模式--之二:SLF4J+Logback
下一篇: JAVA日志组件系列(三)log4j+logback+slf4j的关系与调试
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值