拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系
日志框架的困惑
作为一个正常的项目,是必须有日志框架的存在的,没有日志,很难追踪一些奇奇怪怪的系统问题。
但是,我们经常在项目的依赖中,见到奇奇怪怪 slf4j-api,slf4j-log4j12,log4j-over-slf4j,log4j,log4j-core,logback,这些这么多,每次配置日志要导入这些包。
难免有些疑惑,为啥导入这么多依赖,有时候按照习惯导入的依赖,引入之后日志框架报错,多重绑定等等问题。
以及,配置文件有log4j.xml ,有log4j2.xml,有logging.properties,有logback.xml,log4j.properties,完全不知道怎么对应。
例如一个经常见到的,多重SLF4j绑定的错误,在SpringBoot项目中报错是无法启动的。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/project/org.slf4j/slf4j-log4j12/1.7.10/xxx/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/project/ch.qos.logback/logback-classic/1.1.2/xxx/logback-classic-1.1.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
jul
JUL就是 JDK的LOG,(java.util.logging or JUL for short),这个就是JDK原生的了,仅仅满足最基本最原始的日志需求。
SLF4j
slf4j只是一个日志标准,并不是日志系统的具体实现。理解这句话非常重要,slf4j只做两件事情:
提供日志接口
提供获取具体日志对象的方法
slf4j-simple、logback都是slf4j的具体实现,log4j并不直接实现slf4j,但是有专门的一层桥接slf4j-log4j12来实现slf4j。
也就是说,我们可以推定,现在的稍微新一点的系统中一般都会有slf4j-api,看名字就知道这个依赖是少不了的。我们不用担心他导致冲突。
log4j
log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布。
Log4j已经被移植到了C,C++,C#,Perl,Python和Ruby等语言中。
Log4j是高度可配置的,并可通过在运行时的外部文件配置。它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,诸如:数据库,文件,控制台,UNIX系统日志等。
Log4j中有三个主要组成部分:loggers: 负责捕获记录信息。appenders : 负责发布日志信息,以不同的首选目的地。layouts: 负责格式化不同风格的日志信息。
logback
logback 是log4j创始人写的,性能比log4j要好,是目前最好,最推荐使用的框架,目前主要分为3个模块
logback-core:核心代码模块
logback-classic:log4j的一个改良版本,同时实现了slf4j的接口,这样你如果之后要切换其他日志组件也是一件很容易的事
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能。
这里就不介绍 logback 为什么能取代log4j了
jcl
JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging"。
JCL这个日志框架跟Log4J,Java Logging API等日志框架不同。
JCL采用了设计模式中的“适配器模式”,它对外提供统一的接口,然后在适配类中将对日志的操作委托给具体的日志框架,比如Log4J,Java Logging API等。
可见,他是和 slf4j 差不多的,但是需要适配的。
SLF4j 的转换关系以及工作原理
这里也不做过多介绍,看这个官网的图,一目了然

另外,桥接适配的图:

这里做一下简短的说明,
slf4j-log4j12 是用log4j实现的slf4j,会强制将SLF4j的请求转发为log4j的实现,配置文件对应log4j.xml。
log4j-over-slf4j 是桥接所有log4j的API,转向 SLF4j的实现。如果这两者同时出现,则导致互相调用导致无限循环。他的作用是解决 logback和log4j共存的问题,有些依赖框架使用了log4j,这可以使得框架的日志能够被转发到logback中。
The presence of slf4j-log4j12.jar, that is the log4j binding for SLF4J, will force all SLF4J calls to be delegated to log4j. The presence of log4j-over-slf4j.jar will in turn delegate all log4j API calls to their SLF4J equivalents. If both are present simultaneously, slf4j calls will be delegated to log4j, and log4j calls redirected to SLF4j, resulting in an endless loop.
同理,jul-over-slf4j,jcl-over-slf4j,都是这个作用,将jul 以及 jcl 适配到 slf4j的实现类中。(通常是 logback,over 的含义就是 the underlying,jcl 门面,底层实现为slf4j的实现 )
log4j , log4j-core, logback的配置文件对应关系
log4j 这个一般是 1.x的也就是 对应配置文件为 log4j.xml
log4j-core 这个是 2.x 的log4j,因为log4j已经过时。而他对应 log4j2.xml
slf4j-log4j12 这个实际上对应 log4j 1.2,他的配置文件是 log4j.xml
logback-classic和logback-core 就是 logback.xml
注意 log4j的配置文件语法,和 log4j2,以及logback这三者的语法均不相同。
相关的语法,不建议在博客中复制,直接查看apache log4j ,以及 qos.ch 官网(包含 slf4j ,log4j,logback)的配置文件示例。
理由如下:
log4j的配置文件:
appender里面的是 level,而root里面是priority。很多博客给出的是错误的。
拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系的更多相关文章
- Java日志框架:logback详解
为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结 ...
- 【转】Java日志框架:logback详解
为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结 ...
- java日志框架log4j详细配置及与slf4j联合使用教程
最后更新于2017年02月09日 一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” <d ...
- [转载]java日志框架log4j详细配置及与slf4j联合使用教程
一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...
- java日志框架log4j详细配置及与slf4j使用教程
一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...
- Java日志框架(Commons-logging,SLF4j,Log4j,Logback)
简介 在系统开发中,日志是很重要的一个环节,日志写得好对于我们开发调试,线上问题追踪等都有很大的帮助.但记日志并不是简单的输出信息,需要考虑很多问题,比如日志输出的速度,日志输出对于系统内存,CPU的 ...
- Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)
一.简介 JAVA日志在初期可能官方并没有提供很好且实用的规范,导致各公司或OSS作者选择自行造轮子,这也导致了目前初学者觉得市面上 Java 日志库繁杂的局面. 现在市面流行以 slf4j(Simp ...
- java日志框架之logback(一)——logback工程简介
Logback工程 致力于成为log4j工程的继承者 Logback的架构足够泛型化,故能够应用于许多不同的环境.当前,logback划分为三个组件: logback-core logback-cla ...
- Java程序员最常用的8个Java日志框架
转自:http://www.codeceo.com/article/8-java-log-framework.html 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用 ...
随机推荐
- 【笔试题】Java笔试题知识点
Java高概率笔试题知识点 Java语法基础部分 [解析]java命令程序执行字节码文件是,不能跟文件的后缀名! 1.包的名字都应该是由小写单词组成,它们全都是小写字母,即便中间的单词亦是如此 2.类 ...
- Mysql INSTR函数
在Mysql中,可以使用INSTR(str,substr)函数,用于在一个字符串(str)中搜索指定的字符(substr),返回找到指定的字符的第一个位置(index),index是从1开始计算,如果 ...
- 手把手教你如何在Windows下allure与jenkins的集成生成让你一见钟情的测试报告 - 03(非常详细,非常实用)
简介 好了,国庆假期结束,开始搬砖.为什么要把allure和jenkins集成了?原因是集成以后,我们就可以直接查看allure的结果,不需要重复输入命令.重复使用浏览器打开文件来查看allure的结 ...
- Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解
之前通过Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档一文,我们学习了如何使用Swagger为Spring Boot项目自动生成API文档,有不少用户留言问了关于文档 ...
- vertical-align之见
ertical-align 英文翻译为垂直对齐 ,常用来应用于table 表格中文字的垂直居中:脱离表格后不常用: 有朋友问起:故总结记之: 开局一张图,下来全靠编 这是一个简单的四线表格,小学时 ...
- java的日期时间处理(待更新)
1. /* * 将时间转换为时间戳 */ public static String dateToStamp(String s) throws ParseExcepti ...
- php数字函数
is_numeric() 检查变量是否包含一个合法数字 round() 取整数,四舍五入 round(数字, 小数位) ceil() 向上取整 floor() 向下取整 range() 生成范围 ...
- Cocos Creator实现左右跳游戏,提供完整游戏代码工程
1. 玩法说明 游戏开始后,点击屏幕左右两侧,机器人朝左上方或右上方跳一步,如果下一步有石块,成功得1分,否则游戏结束. 2. 模块介绍 游戏场景分为2个:主页场景(home).游戏场景(game) ...
- CS184.1X 计算机图形学导论 作业0
1.框架下载 在网站上下载了VS2012版本的作业0的框架,由于我的电脑上的VS是2017版的,根据提示安装好C++的版本,并框架的解决方案 重定解决方案目标为2017版本. 点击运行,可以出来界面. ...
- Python高级核心技术97讲 ☝☝☝
Python高级核心技术97讲 ☝☝☝ Python高级核心技术97讲 系列教程 学习 教程 Python的标准整数类型是最通用的数字类型.在大多数32位机器上,标准整数类型的取值范围是-2**31 ...