Java常用日志框架介绍
Java常用日志框架介绍
文章目录
日志接口和日志框架的区别
Java有很多日志框架和主流日志接口,要熟悉Java常用日志框架,就要先学会区分日志接口和日志框架。
- 日志接口:只提供API定义,没有提供具体实现。目的是为应用层提供标准化的使用方式。
- 日志框架:具体的日志实现,是提供对日志的收集/管理功能等功能的框架。
首先我们要确定一个思想先,日志接口是作为一种规范而存在的,就是我们所谓的面向接口编程,而通常一个框架往往都是面向接口进行开发的。
可以打个比方:所有数据库(如MySQL,sql server)的java驱动都是面向JDBC接口的去实现的,这样就可以提供给程序员统一的接口(你MySQL具体是怎么实现数据库连接的,管我程序员什么事情,我用JDBC接口去编程就行了,就算以后用sql server的数据库也不影响我,我只要更换驱动jar包就可以了,完全不影响我原来的业务代码)。
现在主流就两个日志接口:
- SLF4J (目前好用的)
- J.C.L(commons-logging) (比较老旧)
- jboss-logging (没用过,不过也算主流中)
而日志框架大概有这些:
- Log4j 最初期主流的
- J.U.L(jdk-logging) JDK自带的,十分简陋,几乎没人用
- Log4j2 apache重构的,但其实跟Log4j关系不大(可以说是apache组织自己新写的一个,跟Log4j没有太多相识的地方)
- Logback Log4j 的原作者写的新的日志框架
各个框架出现的时间线
为了看这些时间点,我故意上网搜索了他们各自出现的时间点,下面的时间线内容来自:
- Log4j
- JUL(jdk-logging)
- JCL(commons-logging)
- Slf4j
- Logback
- Log4j2
时间线上最新的是Log4j2框架,但是对应我们程序员用的是接口,所有实际上我们是面向Slf4j接口进行编程的。
桥接包
实际开发往往有可能是多种日志实现框架混用,而有些日志实现框架并不是面向Slf4j接口的。所以需要借助桥接类进行日志的转换,最后统一成一种进行输出。这时就是桥接框架的作用了。还有一点要注意的:桥接包本身不一定包含日志框架
下面的表中,左边为暴露的接口,右边为套住的实现框架和接口。
- jcl-over-slf4j.jar :jcl ——> slf4j (用JUL接口套到slf4j接口上面)
- slf4j-jcl.jar :slf4j ——> jcl (用slf4j接口套到 jcl接口上面)
- log4j-over-slf4j :log4j ——> slf4j
- slf4j-log4j12.jar :slf4j ——> log4j
- jul-to-slf4j :jul ——> slf4j
- slf4j-jdk14.jar :slf4j ——> jul
- log4j-jcl :jcl ——> log4j2
- log4j-1.2-api :log4j ——> log4j2
- log4j-slf4j-impl :slf4j ——> log4j2
- log4j-jul :jul ——> log4j2
- log4j-to-slf4j :log4j2 ——> slf4j
slf4j-simple、logback都是slf4j的具体实现,但log4j并不直接实现slf4j,原因也十分简单,因为log4j出来得比slf4j早,但是有专门的一层桥接slf4j-log4j12来实现slf4j.
又比如我使用log4j做日志框架,但是在一个项目中我使用的JCL接口,在另一个项目中我使用的slf4j接口,现在我想使用JCL接口的项目也变成slf4j接口,这时我可以slf4j-jcl做一层桥接。
Log4j2
为什么要故意把这个接口框架拿出来讲呢,主要这个日志框架比较特别,因为它不是直接面向slf4j或者J.C.L(commons-logging)去实现的,它比较特别。
Log4j2并不完全兼容Log4j(和Log4j的其他版本,如:Log4j1.x),前面也说过跟Log4j关系不大。
Log4j2搞分离实现,分化成log4j-api
和log4j-core
,log4j-api
是接口,log4j-core
是实现,但它又兼容slf4j或者J.C.L(commons-logging)这些门面接口。因为这逼出了很多桥接包。
常用搭配
单独的log4j
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
使用JCL(commons-logging)接口的JUL
commons-logging这个jar包用的接口J.C.L(commons-logging),不过自身默认实现为JUL(jdk-logging),因为JUL是jdk-logging,所以不用导入JUL的包。
<dependency>
<!--JCL接口包,不过如果没有其他日志框架的情况下,默认使用JUL实现日志功能-->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
使用JCL(commons-logging)接口的log4j
使用接口JCL(commons-logging),不过底层日志实现变成了log4j。
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
使用slf4j接口的logback
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
使用slf4j接口的log4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>test</scope>
</dependency>
使用log4j2
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
使用slf4j接口的log4j2
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<scope>test</scope>
</dependency>
其余搭配我就不讲了,直接对照桥接包和要使用的接口照套就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)