Java常用日志框架介绍
Java常用日志框架介紹
文章目錄
- Java常用日志框架介紹
- 日志接口和日志框架的區(qū)別
- 各個(gè)框架出現(xiàn)的時(shí)間線
- 橋接包
- Log4j2
- 常用搭配
- 單獨(dú)的log4j
- 使用JCL(commons-logging)接口的JUL
- 使用JCL(commons-logging)接口的log4j
- 使用slf4j接口的logback
- 使用slf4j接口的log4j
- 使用log4j2
- 使用slf4j接口的log4j2
日志接口和日志框架的區(qū)別
Java有很多日志框架和主流日志接口,要熟悉Java常用日志框架,就要先學(xué)會(huì)區(qū)分日志接口和日志框架。
- 日志接口:只提供API定義,沒(méi)有提供具體實(shí)現(xiàn)。目的是為應(yīng)用層提供標(biāo)準(zhǔn)化的使用方式。
- 日志框架:具體的日志實(shí)現(xiàn),是提供對(duì)日志的收集/管理功能等功能的框架。
首先我們要確定一個(gè)思想先,日志接口是作為一種規(guī)范而存在的,就是我們所謂的面向接口編程,而通常一個(gè)框架往往都是面向接口進(jìn)行開(kāi)發(fā)的。
可以打個(gè)比方:所有數(shù)據(jù)庫(kù)(如MySQL,sql server)的java驅(qū)動(dòng)都是面向JDBC接口的去實(shí)現(xiàn)的,這樣就可以提供給程序員統(tǒng)一的接口(你MySQL具體是怎么實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接的,管我程序員什么事情,我用JDBC接口去編程就行了,就算以后用sql server的數(shù)據(jù)庫(kù)也不影響我,我只要更換驅(qū)動(dòng)jar包就可以了,完全不影響我原來(lái)的業(yè)務(wù)代碼)。
現(xiàn)在主流就兩個(gè)日志接口:
- SLF4J (目前好用的)
- J.C.L(commons-logging) (比較老舊)
- jboss-logging (沒(méi)用過(guò),不過(guò)也算主流中)
而日志框架大概有這些:
- Log4j 最初期主流的
- J.U.L(jdk-logging) JDK自帶的,十分簡(jiǎn)陋,幾乎沒(méi)人用
- Log4j2 apache重構(gòu)的,但其實(shí)跟Log4j關(guān)系不大(可以說(shuō)是apache組織自己新寫的一個(gè),跟Log4j沒(méi)有太多相識(shí)的地方)
- Logback Log4j 的原作者寫的新的日志框架
各個(gè)框架出現(xiàn)的時(shí)間線
為了看這些時(shí)間點(diǎn),我故意上網(wǎng)搜索了他們各自出現(xiàn)的時(shí)間點(diǎn),下面的時(shí)間線內(nèi)容來(lái)自:
Java日志框架演化歷史 - 知乎 (zhihu.com)
時(shí)間線上最新的是Log4j2框架,但是對(duì)應(yīng)我們程序員用的是接口,所有實(shí)際上我們是面向Slf4j接口進(jìn)行編程的。
橋接包
實(shí)際開(kāi)發(fā)往往有可能是多種日志實(shí)現(xiàn)框架混用,而有些日志實(shí)現(xiàn)框架并不是面向Slf4j接口的。所以需要借助橋接類進(jìn)行日志的轉(zhuǎn)換,最后統(tǒng)一成一種進(jìn)行輸出。這時(shí)就是橋接框架的作用了。還有一點(diǎn)要注意的:橋接包本身不一定包含日志框架
下面的表中,左邊為暴露的接口,右邊為套住的實(shí)現(xiàn)框架和接口。
- 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的具體實(shí)現(xiàn),但log4j并不直接實(shí)現(xiàn)slf4j,原因也十分簡(jiǎn)單,因?yàn)閘og4j出來(lái)得比slf4j早,但是有專門的一層橋接slf4j-log4j12來(lái)實(shí)現(xiàn)slf4j.
又比如我使用log4j做日志框架,但是在一個(gè)項(xiàng)目中我使用的JCL接口,在另一個(gè)項(xiàng)目中我使用的slf4j接口,現(xiàn)在我想使用JCL接口的項(xiàng)目也變成slf4j接口,這時(shí)我可以slf4j-jcl做一層橋接。
Log4j2
? 為什么要故意把這個(gè)接口框架拿出來(lái)講呢,主要這個(gè)日志框架比較特別,因?yàn)樗皇侵苯用嫦騭lf4j或者J.C.L(commons-logging)去實(shí)現(xiàn)的,它比較特別。
Log4j2并不完全兼容Log4j(和Log4j的其他版本,如:Log4j1.x),前面也說(shuō)過(guò)跟Log4j關(guān)系不大。
Log4j2搞分離實(shí)現(xiàn),分化成log4j-api和log4j-core,log4j-api是接口,log4j-core是實(shí)現(xiàn),但它又兼容slf4j或者J.C.L(commons-logging)這些門面接口。因?yàn)檫@逼出了很多橋接包。
常用搭配
單獨(dú)的log4j
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId> </dependency>使用JCL(commons-logging)接口的JUL
commons-logging這個(gè)jar包用的接口J.C.L(commons-logging),不過(guò)自身默認(rèn)實(shí)現(xiàn)為JUL(jdk-logging),因?yàn)镴UL是jdk-logging,所以不用導(dǎo)入JUL的包。
<dependency><!--JCL接口包,不過(guò)如果沒(méi)有其他日志框架的情況下,默認(rèn)使用JUL實(shí)現(xiàn)日志功能--><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId> </dependency>使用JCL(commons-logging)接口的log4j
使用接口JCL(commons-logging),不過(guò)底層日志實(shí)現(xiàn)變成了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>其余搭配我就不講了,直接對(duì)照橋接包和要使用的接口照套就可以了。
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Java常用日志框架介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 六级过了多少分(六级成绩查询)
- 下一篇: java美元兑换,(Java实现) 美元