你真的懂java的日志系統(tǒng)嗎
一、背景
在java的開(kāi)發(fā)中,使用最多也繞不過(guò)去的一個(gè)話(huà)題就是日志,在程序中除了業(yè)務(wù)代碼外,使用最多的就是打印日志。經(jīng)常聽(tīng)到的這樣一句話(huà)就是“打個(gè)日志調(diào)試下”,沒(méi)錯(cuò)在日常的開(kāi)發(fā)、調(diào)試過(guò)程中打印日志是常干的一件事,同時(shí)系統(tǒng)正常運(yùn)行過(guò)程中必要的日志打印也是必須的。
二、詳情
在筆者剛接觸java程序的時(shí)候,打印日志經(jīng)常使用到到下面的代碼,
System.out.println("hello log");
我相信在不了解日志系統(tǒng)的前提下使用上述的方式是最多的,同時(shí)也是新手小白最常用的方式,筆者曾經(jīng)也是使用最多的。那么除了上述的方式還有其他的方式嗎?答案是肯定的
2.1、java自帶的日志
在java的API中提供了一套日志打印的方法,java程序人員在設(shè)計(jì)之初已經(jīng)想到了這方面的功能,所以從JDK1.4起提供了日志打印的API,只不過(guò)被大多數(shù)人忽略了。這套API在java.util.logging包下,使用該種方式不需要引任何的jar,只要在java環(huán)境下即可使用。
如上圖,是java提供的日志的一些類(lèi)。使用方法類(lèi)似下面的代碼,
public static Logger logger=Logger.getLogger(Test.class.toString()); logger.info("hello log");
注意Logger的路徑是java.util.logging.Logger。
2.2、log4j
log4j是apache的一個(gè)項(xiàng)目,其中又分為log4j1和log4j2,所謂log4j1指的就是其大版本號(hào)為1,不過(guò)log41在很早之前就已經(jīng)停止更新了,源碼官網(wǎng):https://github.com/apache/logging-log4j1
可以看的在2012年已經(jīng)停止更新了,也就是說(shuō)現(xiàn)在通常來(lái)說(shuō)使用的log4j都是log4j2,更確切的說(shuō)是log4j,為了準(zhǔn)確期間,這里還是和之前的版本進(jìn)行區(qū)分,使用log4j2的名字,log4j2是在log4j1基礎(chǔ)上的升級(jí),并吸收了logback這個(gè)框架的優(yōu)秀之處且修復(fù)了其很多問(wèn)題,可以說(shuō)log4j2是一個(gè)優(yōu)秀的日志框架,其源碼官網(wǎng):https://github.com/apache/logging-log4j2
官網(wǎng):https://logging.apache.org/log4j/2.x/index.html
log4j2的maven依賴(lài)如下,引入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>
這里有個(gè)問(wèn)題要注意,log4j1和log4j2的groupId是不一樣的,log4j1的是org.apache.log4j,log4j2的是org.apache.logging.log4j,帶來(lái)的變化就是在使用的過(guò)程中要注意引用的類(lèi)的路徑,從路徑上可以確定是使用的log4j1.x還是log4j2.x,如果是org.apache.log4j開(kāi)頭的包路徑那么是版本1的,是org.apache.logging.log4j開(kāi)頭的是版本2的。
使用方式類(lèi)似如下,
private static final Logger logger= LogManager.getLogger(); logger.info();
2.3、logback
logback是一個(gè)開(kāi)源的日志框架,是log4j的作者為了代替log4j而開(kāi)發(fā)的。logback包含三部分,logback-core、logback-classic、logback-access,logback-core是其他兩個(gè)模塊的核心,常用到的是logback-core+logback-classic。logback-access常和jetty和tomcat結(jié)合。
logback的groupId為ch.qos.logback,其maven依賴(lài)如下
<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> <!--平時(shí)用不到,可不引入--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>1.2.10</version> </dependency>
使用方法可參考:https://www.jianshu.com/p/3e3b550920b3
其官網(wǎng):https://logback.qos.ch/index.html
2.4、slf4j
slf4j不能稱(chēng)之為一個(gè)日志框架,因?yàn)樗鼉H僅提供了一系列的標(biāo)準(zhǔn),提供一系列接口,但沒(méi)有實(shí)現(xiàn),采用的是門(mén)面模式。
其依賴(lài)為:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency>
上面便是slf4j的核心包。
注意:如果使用slf4j出現(xiàn)下面的日志
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.
說(shuō)明沒(méi)有日志實(shí)現(xiàn)框架,slf4j自己實(shí)現(xiàn)了一個(gè)日志框架,可以加上下面的依賴(lài)
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.36</version> </dependency>
slf4j可以和其他具體的日志實(shí)現(xiàn)框架進(jìn)行結(jié)合使用,如下
上圖是一個(gè)slf4j和其他日志框架結(jié)合的圖形展示,
slf4j+logback
需要slf4j-api、logback-api、logback-classic三個(gè)包
slf4j+JDK日志
需要slf4j-api、slf4j-jdk14,其中slf4j-jdk14是slf4j和JDK日志結(jié)合的jar。
slf4j+log4j
需要slf4j+slf4j-log4j12
slf4j+JCL
需要slf4j、common-logging
其官網(wǎng):https://www.slf4j.org/
2.5、JCL
JCL是Jakarta Commons Logging的簡(jiǎn)寫(xiě),又叫Apache Commons Logging,提供的是一個(gè) Java 的日志接口,同時(shí)兼顧輕量級(jí)和不依賴(lài)于具體的日志實(shí)現(xiàn)工具。它提供給中間件/日志工具開(kāi)發(fā)者一個(gè)簡(jiǎn)單的日志操作抽象,允許程序開(kāi)發(fā)人員使用不同的具體日志實(shí)現(xiàn)工具。用戶(hù)被假定已熟悉某種日志實(shí)現(xiàn)工具的更高級(jí)別的細(xì)節(jié)。JCL提供的接口,對(duì)其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,進(jìn)行了簡(jiǎn)單的包裝,此接口更接近于Log4J和LogKit的實(shí)現(xiàn)。
其包為common-logging.jar包含了所有的功能,還有其他另外兩個(gè)包c(diǎn)ommon-logging-api、common-logging-adapters
官網(wǎng):https://commons.apache.org/proper/commons-logging/guide.html
三、總結(jié)
本文簡(jiǎn)單總結(jié)了java中常用的日志,其中slf4j和JCL是日志的接口,又都進(jìn)行了簡(jiǎn)單實(shí)現(xiàn),既可以自己?jiǎn)为?dú)使用,又可以和其他實(shí)現(xiàn)日志框架結(jié)合使用,如,log4j、logback、JDK logging等。
到此這篇關(guān)于java日志系統(tǒng)的文章就介紹到這了,更多相關(guān)java日志系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java通過(guò)jacob實(shí)現(xiàn)office在線(xiàn)預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了java通過(guò)jacob實(shí)現(xiàn)office在線(xiàn)預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Spring實(shí)戰(zhàn)之注入嵌套Bean操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之注入嵌套Bean操作,結(jié)合實(shí)例形式分析了嵌套Bean相關(guān)配置與使用操作技巧,需要的朋友可以參考下2019-11-11idea 修改項(xiàng)目名和module名稱(chēng)的操作
這篇文章主要介紹了idea 修改項(xiàng)目名和module名稱(chēng)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Java 實(shí)現(xiàn)分布式服務(wù)的調(diào)用鏈跟蹤
分布式服務(wù)中完成某一個(gè)業(yè)務(wù)動(dòng)作,需要服務(wù)之間的相互協(xié)作才能完成,在這一次動(dòng)作引起的多服務(wù)的聯(lián)動(dòng)我們需要用1個(gè)唯一標(biāo)識(shí)關(guān)聯(lián)起來(lái),關(guān)聯(lián)起來(lái)就是調(diào)用鏈的跟蹤。本文介紹了Java 實(shí)現(xiàn)分布式服務(wù)的調(diào)用鏈跟蹤的步驟2021-06-06springboot?使用websocket技術(shù)主動(dòng)給前端發(fā)送消息的實(shí)現(xiàn)
這篇文章主要介紹了springboot?使用websocket技術(shù)主動(dòng)給前端發(fā)送消息的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java實(shí)現(xiàn)AOP功能的封裝與配置的小框架實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)AOP功能的封裝與配置的小框架實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02解決JAVA8 Collectors.toMap value為null報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決JAVA8 Collectors.toMap value為null報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01