你還不懂java的日誌系統嗎

北漂程式設計師發表於2022-02-12

一、背景

在java的開發中,使用最多也繞不過去的一個話題就是日誌,在程式中除了業務程式碼外,使用最多的就是列印日誌。經常聽到的這樣一句話就是“打個日誌除錯下”,沒錯在日常的開發、除錯過程中列印日誌是常乾的一件事,同時系統正常執行過程中必要的日誌列印也是必須的。

二、詳情

在筆者剛接觸java程式的時候,列印日誌經常使用到到下面的程式碼,

System.out.println("hello log");

我相信在不瞭解日誌系統的前提下使用上述的方式是最多的,同時也是新手小白最常用的方式,筆者曾經也是使用最多的。那麼除了上述的方式還有其他的方式嗎?答案是肯定的

2.1、java自帶的日誌

在java的API中提供了一套日誌列印的方法,java程式人員在設計之初已經想到了這方面的功能,所以從JDK1.4起提供了日誌列印的API,只不過被大多數人忽略了。這套API在java.util.logging包下,使用該種方式不需要引任何的jar,只要在java環境下即可使用。

如上圖,是java提供的日誌的一些類。使用方法類似下面的程式碼,

public static Logger logger=Logger.getLogger(Test.class.toString());
logger.info("hello log");

注意Logger的路徑是java.util.logging.Logger。

2.2、log4j

log4j是apache的一個專案,其中又分為log4j1和log4j2,所謂log4j1指的就是其大版本號為1,不過log41在很早之前就已經停止更新了,原始碼官網:https://github.com/apache/logging-log4j1

可以看的在2012年已經停止更新了,也就是說現在通常來說使用的log4j都是log4j2,更確切的說是log4j,為了準確期間,這裡還是和之前的版本進行區分,使用log4j2的名字,log4j2是在log4j1基礎上的升級,並吸收了logback這個框架的優秀之處且修復了其很多問題,可以說log4j2是一個優秀的日誌框架,其原始碼官網:https://github.com/apache/logging-log4j2

官網:https://logging.apache.org/log4j/2.x/index.html

log4j2的maven依賴如下,引入log4j-api和log4j-core即可,

 <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.1</version>
  </dependency>

這裡有個問題要注意,log4j1和log4j2的groupId是不一樣的,log4j1的是org.apache.log4j,log4j2的是org.apache.logging.log4j,帶來的變化就是在使用的過程中要注意引用的類的路徑,從路徑上可以確定是使用的log4j1.x還是log4j2.x,如果是org.apache.log4j開頭的包路徑那麼是版本1的,是org.apache.logging.log4j開頭的是版本2的。

使用方式類似如下,

private static final Logger logger= LogManager.getLogger();
logger.info();

2.3、logback

logback是一個開源的日誌框架,是log4j的作者為了代替log4j而開發的。logback包含三部分,logback-core、logback-classic、logback-access,logback-core是其他兩個模組的核心,常用到的是logback-core+logback-classic。logback-access常和jetty和tomcat結合。

logback的groupId為ch.qos.logback,其maven依賴如下

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.10</version>
  </dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.10</version>
  </dependency>
<!--平時用不到,可不引入-->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.2.10</version>
  </dependency>

使用方法可參考:https://www.jianshu.com/p/3e3b550920b3

其官網:https://logback.qos.ch/index.html

2.4、slf4j

slf4j不能稱之為一個日誌框架,因為它僅僅提供了一系列的標準,提供一系列介面,但沒有實現,採用的是門面模式。

其依賴為:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.36</version>
  </dependency>

上面便是slf4j的核心包。

注意:如果使用slf4j出現下面的日誌

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

說明沒有日誌實現框架,slf4j自己實現了一個日誌框架,可以加上下面的依賴

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.36</version>
  </dependency>

 

slf4j可以和其他具體的日誌實現框架進行結合使用,如下

上圖是一個slf4j和其他日誌框架結合的圖形展示,

slf4j+logback

需要slf4j-api、logback-api、logback-classic三個包

slf4j+JDK日誌

需要slf4j-api、slf4j-jdk14,其中slf4j-jdk14是slf4j和JDK日誌結合的jar。

slf4j+log4j

需要slf4j+slf4j-log4j12

slf4j+JCL

需要slf4j、common-logging

其官網:https://www.slf4j.org/

2.5、JCL

JCL是Jakarta Commons Logging的簡寫,又叫Apache Commons Logging,提供的是一個 Java 的日誌介面,同時兼顧輕量級和不依賴於具體的日誌實現工具。它提供給中介軟體/日誌工具開發者一個簡單的日誌操作抽象,允許程式開發人員使用不同的具體日誌實現工具。使用者被假定已熟悉某種日誌實現工具的更高階別的細節。JCL提供的介面,對其它一些日誌工具,包括Log4J, Avalon LogKit, and JDK 1.4等,進行了簡單的包裝,此介面更接近於Log4J和LogKit的實現。

其包為common-logging.jar包含了所有的功能,還有其他另外兩個包common-logging-api、common-logging-adapters

 

官網:https://commons.apache.org/proper/commons-logging/guide.html

三、總結

本文簡單總結了java中常用的日誌,其中slf4j和JCL是日誌的介面,又都進行了簡單實現,既可以自己單獨使用,又可以和其他實現日誌框架結合使用,如,log4j、logback、JDK logging等。

 

相關文章