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 的原作者写的新的日志框架

各个框架出现的时间线

为了看这些时间点,我故意上网搜索了他们各自出现的时间点,下面的时间线内容来自:

Java日志框架演化历史 - 知乎 (zhihu.com)

  1. Log4j
  2. JUL(jdk-logging)
  3. JCL(commons-logging)
  4. Slf4j
  5. Logback
  6. 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-apilog4j-corelog4j-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>

其余搭配我就不讲了,直接对照桥接包和要使用的接口照套就可以了。

posted @   鸭梨的药丸哥  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示