java 日志框架总结

来源:互联网 发布:js判断ie9及以下版本 编辑:程序博客网 时间:2024/06/10 14:45

简介

  • 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 给出了相应的解决方案,所以是最优选择。
0 0
原创粉丝点击