Java常用日志框架介绍
Java常用日志框架介紹
文章目錄
- Java常用日志框架介紹
- 日志接口和日志框架的區別
- 各個框架出現的時間線
- 橋接包
- Log4j2
- 常用搭配
- 單獨的log4j
- 使用JCL(commons-logging)接口的JUL
- 使用JCL(commons-logging)接口的log4j
- 使用slf4j接口的logback
- 使用slf4j接口的log4j
- 使用log4j2
- 使用slf4j接口的log4j2
日志接口和日志框架的區別
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)
時間線上最新的是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-api和log4j-core,log4j-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>其余搭配我就不講了,直接對照橋接包和要使用的接口照套就可以了。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Java常用日志框架介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 六级过了多少分(六级成绩查询)
- 下一篇: Java volatile关键字原理解剖