简介
- commons-logging(jcl) : apache 提供的日志框架接口,spring 默认使用的框架接口。现在已经很久没有更新了。
- slf4j : 也是一种日志框架接口,可以自由的选择具体的日志框架。和 commons-logging 实现方法不同,持续更新中。
- java.util.logging(jul) : java 自带的一个简单的日志框架。
- logback : 从 log4j 1.x 版本继承发展过来的,目的的是提供比log4j 1.x 更好的解决方案。它也是 slf4j 提供的框架接口的本地实现。
- log4j : 有 1.x 和 2.x 两个版本,1.x 版本较差因此产生了 logback ,而 2.x 版本进行了较大的改进,并且2.x 版本也在向日志框架接口方向发展,支持了对 jul 的适配。
日志框架的使用分为三种情况:
- 单独使用 log4j 1.x , jul ,只需要依赖相应的 jar 包,但是程序和具体的日志框架直接耦合,不利于以后的扩展。
- 使用slf4j 或者 jcl 作为日志接口,选择 logback , log4j , jul 中的一种作为具体的实现。这种方法是最好的选择。程序不与具体的日志框架耦合。
- 程序的部分旧模块采用了第一种方法(跟糟糕的情况可能不能的模块采用的是不同的日志框架),现在想要用第二种方法。
maven 配置
单独使用log4j 1.x
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>{log4j.version}</version>
</dependency>
单独使用log4j 2.x
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>{log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>{log4j.version}</version>
</dependency>
单独使用logback(logback-classic 模块是 slf4j 的本地实现,因此必须依赖 slf4j )。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>{logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>{logback.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>{slf4j.version}</version>
</dependency>
slf4j 作为日志接口框架
logback 作为slf4j 提供的接口本地实现不需要增加适配层外,log4j 和 jul 都需要添加适配层:
- 与 log4j 1.x 集成
If you wish to use log4j as the underlying logging framework, all you need to do is to declare "org.slf4j:slf4j-log4j12" as a dependency in your pom.xml file as shown below. In addition to slf4j-log4j12-1.7.25.jar, this will pull slf4j-api-1.7.25.jar as well as log4j-1.2.17.jar into your project. Note that explicitly declaring a dependency on log4j-1.2.17.jar or slf4j-api-1.7.25.jar is not wrong and may be necessary to impose the correct version of said artifacts by virtue of Maven's "nearest definition" dependency mediation rule.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
- 与 log4j 2.x 集成
除 slf4j 和 log4j 的 jar 包之外还需要添加 log4j 对 slf4j 的桥接:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>{log4j-slf4j-impl.version}</version>
</dependency>
- 与 jul 集成
If you wish to use java.util.logging as the underlying logging framework, all you need to do is to declare "org.slf4j:slf4j-jdk14" as a dependency in your pom.xml file as shown below. In addition to slf4j-jdk14-1.7.25.jar, this will pull slf4j-api-1.7.25.jar into your project. Note that explicitly declaring a dependency on slf4j-api-1.7.25.jar is not wrong and may be necessary to impose the correct version of said artifact by virtue of Maven's "nearest definition" dependency mediation rule.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.25</version>
</dependency>
使用 commons-logging 作为接口框架
- 与 jul 集成
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>{commons-logging.version}</version>
</dependency>
- 与 log4j 1.x 集成
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>{commons-logging.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>{log4j.version}</version>
</dependency>
- 与 log4j 2.x 集成
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>{commons-logging.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>{log4j-api.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>{log4j-core.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>{log4j-jcl.version}</version>
</dependency>
- 与 logback 集成
由logback 提供了支持 commons-logging 语法的 jar,修改了 commons-logging 的部分内容。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
日志之间切换
- log4j 1.x 切换到 logback : 去掉 log4j,添加 logback-core,logback-classic,slf4j-api,log4j-over-logback 。
- jul 切换到 logback : 添加 jul-to-slf4j,logback-core,logback-classic,slf4j-api。
- commons-logging 切换到 logback : 去掉commons-logging,添加 logback-core,logback-classic,slf4j-api,jcl-over-logback。
- slf4j 切换到 commons-logging: slf4j 给出了采用 slf4j 的 API 之后而不得不使用commons-logging 时,可以通过添加 slf4j-jcl 来将日志调用委派给 jcl。
混合使用多种框架整合
slf4j 官方提供了一下几种情况的整合方法:
包冲突
slf4j-jcl 与 jcl-over-slf4j : slf4j-jcl 提供了将日志调用委派给 jcl ,而 jcl-over-slf4j 将调用委派给 slf4j ,形成相互委托。同理还有:
- log4j-over-slf4j 与 slf4j-log4j12
- jul-to-slf4j 与 slf4j-jdk14
总结
- 目前logback和log4j 2.x 并驾齐驱,所以对于新项目而言,两者都可以选择。而commons-logging 和 log4j 1.x 都不在更新,所以新项目并不考虑。
- 考虑到对项目依赖的兼容性,老的项目依赖的日志组件可能是多种多样的。而 slf4j 给出了相应的解决方案,所以是最优选择。