自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

讓你10分鐘徹底了解Java中混亂的日志體系

開(kāi)發(fā) 后端
說(shuō)到日志工具,日常工作或?qū)W習(xí)中肯定聽(tīng)說(shuō)過(guò)這些名詞:log4j、logback、jdk-logging、slf4j、commons-logging等,它們之間有什么關(guān)系呢,在整個(gè)日志體系中又扮演什么角色呢?

日志框架分為三大部分,包括日志門(mén)面、日志適配器、日志庫(kù)。利用門(mén)面設(shè)計(jì)模式,即Facade來(lái)進(jìn)行解耦,使日志使用變得更加簡(jiǎn)單,如下圖:

 

讓你10分鐘徹底了解Java中混亂的日志體系

 

日志門(mén)面

門(mén)面設(shè)計(jì)模式是面向?qū)ο笤O(shè)計(jì)模式中的一種,日志框架采用的就是這種模式,類似JDBC的設(shè)計(jì)理念。它只提供一套接口規(guī)范,自身不負(fù)責(zé)日志功能的實(shí)現(xiàn),目的是讓使用者不許奧關(guān)注底層具體是哪個(gè)日志庫(kù)來(lái)負(fù)責(zé)日志打印及具體的使用字節(jié)等。目前用得最廣泛的日志門(mén)面有 slf4j和commons-logging。

日志庫(kù)

它具體實(shí)現(xiàn)了日志的相關(guān)的功能,主流的日志庫(kù)有三個(gè): log4j、log-jdk、logback。最早java 要想記錄只能通過(guò)System.out 或 System.err 來(lái)完成,非常不方便。log4j 就是為了解決這一問(wèn)題而提出的,它是最早誕生的日志庫(kù)。接著JDK也在1.4 版本引入一個(gè)日志庫(kù) java.util.logging.Logger,簡(jiǎn)稱 log-jdk。這樣市面上就出現(xiàn)兩種日志功能的實(shí)現(xiàn),開(kāi)發(fā)者在使用時(shí)需要關(guān)注所使用的日志庫(kù)的具體字節(jié)。logback是最晚出現(xiàn)的,它與log4j出自同一個(gè)作者,是log4j的升級(jí)版且本身就實(shí)現(xiàn)了 slf4j 的接口。

日志適配器

日志適配器分為兩種場(chǎng)景:

(1) 日志門(mén)面適配器,因?yàn)閟lf4j 規(guī)范是后來(lái)提出的,在此之前的日志庫(kù)沒(méi)有實(shí)現(xiàn) slf4j 的接口的,例如 log4j, 所以,在工程里要想使用slf4j + log4j 的模式,就額外需要一個(gè)適配器(slf4j + log4j2) 來(lái)解決接口不兼容的問(wèn)題。

(2) 日志適配器,在一些老的工程,一開(kāi)始為了開(kāi)發(fā)簡(jiǎn)單而直接使用了日志庫(kù)API 來(lái)完成日志打印,隨著時(shí)間的推移想將原來(lái)直接調(diào)用日志庫(kù)的模型改為業(yè)界標(biāo)準(zhǔn)的門(mén)面模式 ( 例如 slf4j +logback 組合) ,但老工程代碼里的打印日志的地方太多,難以改變,所以需要一個(gè)適配器來(lái)完成從舊日志庫(kù)的API到slf4j的路由,這樣在不改動(dòng)原有代碼的情況下也能使用slf4j來(lái)統(tǒng)一管理日志,而且后續(xù)自由替換具體日志庫(kù)也不成問(wèn)題。

1、Apache Commons Logging(JCL)

Commons本身只提供日志接口,具體實(shí)現(xiàn)在運(yùn)行時(shí) 動(dòng)態(tài)尋找對(duì)應(yīng)組件?思路上類似于JDBC的抽象。

JCL動(dòng)態(tài)查找(綁定)日志組件原理如下:

 

讓你10分鐘徹底了解Java中混亂的日志體系

 

JCL為每一種日志采用了一個(gè)適配器,具體采用哪一個(gè),是動(dòng)態(tài)根據(jù)指定順序查找classpath是否存在相應(yīng)日志的實(shí)現(xiàn),如果JCL運(yùn)行時(shí)沒(méi)有找到任何一種第三方的日志實(shí)現(xiàn),則就使用jdk14自帶的java.util.logging(JUL)。

Spring日志就是采JCL,解決了應(yīng)用程序和框架日志不統(tǒng)一的問(wèn)題,動(dòng)態(tài)去尋找(應(yīng)用程序配置)日志體系的實(shí)現(xiàn)。

默認(rèn)的LogFactory是按照下列的步驟去發(fā)現(xiàn)并決定哪個(gè)日志工具將被使用的,LogFactory按照順序?qū)ふ遥业降谝粋€(gè)工具后中止。

  1. 首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到,則使用其中定義的Log實(shí)現(xiàn)類;
  2. 如果找不到commons-logging.properties文件,則在查找是否已定義系統(tǒng)環(huán)境變量org.apache.commons.logging.Log,找到則使用其定義的Log實(shí)現(xiàn)類;
  3. 否則,查看classpath中是否有Log4j的包,如果發(fā)現(xiàn),則自動(dòng)使用Log4j作為日志實(shí)現(xiàn)類;
  4. 否則,使用JDK自身的日志實(shí)現(xiàn)類(JDK1.4以后才有日志實(shí)現(xiàn)類);
  5. 否則,使用commons-logging自己提供的一個(gè)簡(jiǎn)單的日志實(shí)現(xiàn)類SimpleLog;

2、SLF4j(Simple Logging Facade for java)

與JCL類似,本身不提供具體實(shí)現(xiàn),只對(duì)外提供接口或者門(mén)面,因此它不是具體的日志解決方案,而是通過(guò)Facade Pattern 門(mén)面模式對(duì)外提供一些 java logging api,這些對(duì)外提供的核心API就是一些接口以及LoggerFactory的工程類。

與Common logging 不同的是其采用在ClassPath下尋找一下jar包來(lái)表示具體的采用哪種實(shí)現(xiàn)

  1. slf4j-log4j12.jar(表示指定logh4j)
  2. slf-jdk14.jar(表示使用JUL)
  3. slf4j-jcl.jar(表示使用JCL)
  4. log4j-slf4j-impl.jar(表示指定log4j2)
  5. logback-classic(logback)

SLF4j 靜態(tài)綁定日志組件原理:

 

讓你10分鐘徹底了解Java中混亂的日志體系

 

3、常見(jiàn)的日志組件

 

 

4. 適用場(chǎng)景

4.1 slf4j 使用log4j打印日志

  1. slf4j-api.jar
  2. slf4j-log4j12.jar
  3. log4j.jar

JCL方式的common-logging 是動(dòng)態(tài)查找綁定

SLF4j 是靜態(tài)綁定,需要加上橋接包,如 SLF4j-log4j2

可通過(guò)如下配置進(jìn)行集成

  1. <!--slf4j門(mén)面 -->  
  2.        <dependency>  
  3.            <groupId>org.slf4j</groupId>  
  4.            <artifactId>slf4j-api</artifactId>  
  5.            <version>${slf4j-api.version}</version>  
  6.        </dependency>  
  7.        <dependency>  
  8.            <groupId>org.slf4j</groupId>  
  9.            <artifactId>slf4j-log4j12</artifactId>  
  10.            <version>${slf4j-log4j12.jar.version}</version>  
  11.        </dependency>  
  12.        <dependency>  
  13.            <groupId>log4j</groupId>  
  14.            <artifactId>log4j</artifactId>  
  15.            <version>${log4j.version}</version>  
  16.        </dependency>  

 

如果是老代碼中直接使用了 log4j 日志庫(kù)提供的接口來(lái)打印日志,則還需要引入日志庫(kù)適配器,配置實(shí)例如下所示:

  1. <dependency>  
  2.             <groupId>org.slf4j</groupId>  
  3.             <artifactId>log4j-over-slf4j</artifactId>  
  4.             <version>${log4j-over-slf4j.version}</version>  
  5.         </dependency>  

 

4.2 slf4j 使用logback打印日志

 

讓你10分鐘徹底了解Java中混亂的日志體系

 

如果是新工程,則推薦使用slf4j+logback 模式,因?yàn)閘ogback 自身實(shí)現(xiàn)了 slf4j的接口,無(wú)須額外引入適配器,另外,logback 是 log4j 的升級(jí)版,具備比log4j更多的優(yōu)點(diǎn),可通過(guò)如下配置進(jìn)行集成:

  1. <dependency>  
  2.      <groupId>org.slf4j</groupId>  
  3.      <artifactId>slf4j-api</artifactId>  
  4.      <version>${slf4j.version}</version>  
  5.  </dependency>  
  6.   
  7.  <dependency>  
  8.      <groupId>ch.qos.logback</groupId>  
  9.      <artifactId>logback-core</artifactId>  
  10.      <version>${logback.version}</version>  
  11.  </dependency>  
  12.   
  13.  <dependency>  
  14.      <groupId>ch.qos.logback</groupId>  
  15.      <artifactId>logback-classic</artifactId>  
  16.      <version>${logback.version}</version>  
  17.  </dependency>  

 

4.3 spring 集成log4j2

我們應(yīng)用使用的是log4j2打印日志;而Spring采用的JCL中不包含log4j2,運(yùn)行時(shí),JCL從ClassPath下尋找日志的實(shí)現(xiàn),如果沒(méi)有引用其他實(shí)現(xiàn),最終會(huì)使用JUL實(shí)現(xiàn)。如下圖:

 

讓你10分鐘徹底了解Java中混亂的日志體系

 

這時(shí)候會(huì)出現(xiàn)什么問(wèn)題呢?

Spring打印日志和應(yīng)用程序的打印日志不統(tǒng)一,錯(cuò)誤排除還比較困難,而且應(yīng)用程序和Spring框架,日志不統(tǒng)一,太亂了。

為了讓Spring和我們的應(yīng)用程序,采用統(tǒng)一的log4j2日志體系,需要加入適配器,改善上面應(yīng)用程序和框架日志的統(tǒng)一問(wèn)題(加入適配器后),如下圖:

 

讓你10分鐘徹底了解Java中混亂的日志體系
  1. <dependencies>  
  2.         <!--slf4j門(mén)面 -->  
  3.         <dependency>  
  4.             <groupId>org.slf4j</groupId>  
  5.             <artifactId>slf4j-api</artifactId>  
  6.             <version>1.7.25</version>  
  7.         </dependency>  
  8.        <!-- SLF2j-log4j2的橋接-->  
  9.         <dependency>  
  10.             <groupId>org.apache.logging.log4j</groupId>  
  11.             <artifactId>log4j-slf4j-impl</artifactId>  
  12.             <version>2.3</version>  
  13.         </dependency>  
  14.   
  15.       <!-- jcl 橋接 SLF4j -->  
  16.         <dependency>  
  17.             <groupId>org.slf4j</groupId>  
  18.             <artifactId>jcl-over-slf4j</artifactId>  
  19.             <version>1.7.13</version>  
  20.         </dependency>  
  21.   
  22.        <!-- log4j2 -->  
  23.         <dependency>  
  24.             <groupId>org.apache.logging.log4j</groupId>  
  25.             <artifactId>log4j-core</artifactId>  
  26.             <version>2.3</version>  
  27.         </dependency>  
  28.         <dependency>  
  29.             <groupId>org.apache.logging.log4j</groupId>  
  30.             <artifactId>log4j-api</artifactId>  
  31.             <version>2.3</version>  
  32.         </dependency>  
  33.         <dependency>  
  34.             <groupId>com.lmax</groupId>  
  35.             <artifactId>disruptor</artifactId>  
  36.             <version>3.3.4</version>  
  37.         </dependency> 

 

SLF4j集成其他日志框架的方法:

 

讓你10分鐘徹底了解Java中混亂的日志體系

 

5、優(yōu)秀實(shí)踐

在使用SLF4J使用時(shí),需要注意以下事項(xiàng):

  1. private static final Logger LOGGER = LoggerFactory.getLogger(XXX.class);   

logger被定義為static 變量,是因?yàn)檫@個(gè)LOGGER與當(dāng)前類綁定,避免每次都new一個(gè)新對(duì)象,造成資源浪費(fèi)。

 

責(zé)任編輯:華軒 來(lái)源: 今日頭條
相關(guān)推薦

2017-06-07 18:40:33

PromiseJavascript前端

2024-04-28 12:55:46

redis頻道機(jī)制

2023-07-15 18:26:51

LinuxABI

2020-11-06 08:54:43

Vue 3.0函數(shù)代碼

2020-10-13 18:22:58

DevOps工具開(kāi)發(fā)

2017-11-20 10:25:20

數(shù)據(jù)庫(kù)MySQL索引

2021-01-07 08:05:20

JenkinsDevOps

2021-05-17 20:13:50

數(shù)倉(cāng)操作型數(shù)據(jù)庫(kù)

2021-04-23 09:50:41

topLinux命令

2021-03-04 09:26:57

微服務(wù)架構(gòu)數(shù)據(jù)

2011-06-10 14:19:49

SEO百度收錄

2009-11-05 10:56:31

WCF通訊

2018-03-12 21:31:24

區(qū)塊鏈

2023-12-25 14:50:39

Python迭代器

2018-11-28 10:39:48

APP網(wǎng)絡(luò)代碼

2021-06-18 07:34:12

Kafka中間件微服務(wù)

2009-10-27 09:17:26

VB.NET生成靜態(tài)頁(yè)

2009-07-06 15:50:01

微軟Windows 7操作系統(tǒng)

2015-11-12 10:32:40

GitHub控制系統(tǒng)分布式

2018-03-12 14:37:50

區(qū)塊鏈比特幣架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)