Java日志讲解

110 阅读3分钟

Java日志的前世今生

框架诞生顺序 :log4j -->JUL–>JCL–> slf4j --> logback --> log4j2

日志包/依赖介绍
Log4jlog4j1、1996年,欧洲安全电子市场项目组开发日志系统,经过完善后,便成为Log4j(由Ceki大神开发)
2、后来Log4j成为Apache基金会项目中的一员,Ceki也加入Apache组织。Log4j近乎成为Java社区标准
3、apache官方已不再维护,推荐移至log4j2
JUL(Java Util Logging)java.util.logging1、2002年Sun公司参考Log4j推出了自己的日志库JUL(Java Util Logging)
2、JUL纯粹为Sun公司看Log4j眼红开发的,但此时Log4j在市场上占据优势
JCLcommon-logging1、全称为Jakarta Commons Logging,JCL只是定义了一套日志接口(其内部也提供一个Simple Log的简单实现),是Apache提供的一个通用日志API
Slf4jslf4j-api1、2006年Ceki大神离开Apache,创建了Slf4和Logback两个项目
2、Slf4j类似于JUL,是一个日志门面接口
logbacklogback-classic1、Slf4j的实现
2、Ceki大神开发
log4j2log4j-core、log4j-api1、2012年Apache看logback占有率持续上升,于是重写log4j,便开发了log4j2
2、Log4j2具有Logback的所有特性

JUL和Slf4j可以理解为接口,通过门面方式将其他具体实现绑定

日志对应的包

Log4j

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

JCL

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.3.0</version>
</dependency>

Slf4j

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.12</version>
</dependency>

logback

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.5.3</version>
    <scope>test</scope>
</dependency>

log4j2

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.23.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.23.1</version>
</dependency>

日志的组成方式

  • 日志门面(只定义接口,不提供实现)
  • 日志实现(日志框架)
  • 适配器和桥接器(用于连通门面和实现)

一开始都是自己提供API接口,自己实现,如左边这种;慢慢的由于一些原因,同时方便将抽象的接口和具体的实现分离,对外的API接口是固定了,然后根据自己的需要去选择日志的具体实现,中间通过桥接器去连接适配。大致关系如上图。

常见的日志门面如下

JCL停止更新,Spring5.0后由Spring-jcl接入;SLF4J目前是被使用最多的,认可度最高的日志门面

常见的日志框架如下

log4j停止更新,目前使用最多的是logback以及log4j2

SLF4j日志门面框架绑定具体的日志实现

SLF4j 与 JUL 不提供具体的实现,均需要通过桥接方式绑定具体的是日志实现完成日志能力。 SLF4j与不同的日志实现框架通过下图的桥接器完成关系绑定

image.png 注:上图来源于官网:www.slf4j.org/manual.html

日志门面桥接器日志实现
SLF4j-logback
(logback-classic.jar/logback-core.jar)
SLF4jslf4j-reload4j.jarreload4j.jar
SLF4jslf4j-jdk14.jarJVM runtime
SLF4j-slf4j-simple.jar
SLF4jslf4j-nop.jar/dev/null

建议使用SLF4j + log4j2 实现日志能力

参考文章:www.cnblogs.com/zhaodalei/p…