一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 讓你10分鐘徹底了解Java中混亂的日志體系

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

2021-08-02 23:42程序猿W Java教程

說到日志工具,日常工作或學習中肯定聽說過這些名詞:log4j、logback、jdk-logging、slf4j、commons-logging等,它們之間有什么關系呢,在整個日志體系中又扮演什么角色呢?

日志框架分為三大部分,包括日志門面、日志適配器、日志庫。利用門面設計模式,即Facade來進行解耦,使日志使用變得更加簡單,如下圖:

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

日志門面

門面設計模式是面向對象設計模式中的一種,日志框架采用的就是這種模式,類似JDBC的設計理念。它只提供一套接口規范,自身不負責日志功能的實現,目的是讓使用者不許奧關注底層具體是哪個日志庫來負責日志打印及具體的使用字節等。目前用得最廣泛的日志門面有 slf4j和commons-logging。

日志庫

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

日志適配器

日志適配器分為兩種場景:

(1) 日志門面適配器,因為slf4j 規范是后來提出的,在此之前的日志庫沒有實現 slf4j 的接口的,例如 log4j, 所以,在工程里要想使用slf4j + log4j 的模式,就額外需要一個適配器(slf4j + log4j2) 來解決接口不兼容的問題。

(2) 日志適配器,在一些老的工程,一開始為了開發簡單而直接使用了日志庫API 來完成日志打印,隨著時間的推移想將原來直接調用日志庫的模型改為業界標準的門面模式 ( 例如 slf4j +logback 組合) ,但老工程代碼里的打印日志的地方太多,難以改變,所以需要一個適配器來完成從舊日志庫的API到slf4j的路由,這樣在不改動原有代碼的情況下也能使用slf4j來統一管理日志,而且后續自由替換具體日志庫也不成問題。

1、Apache Commons Logging(JCL)

 

Commons本身只提供日志接口,具體實現在運行時 動態尋找對應組件?思路上類似于JDBC的抽象。

JCL動態查找(綁定)日志組件原理如下:

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

JCL為每一種日志采用了一個適配器,具體采用哪一個,是動態根據指定順序查找classpath是否存在相應日志的實現,如果JCL運行時沒有找到任何一種第三方的日志實現,則就使用jdk14自帶的java.util.logging(JUL)。

Spring日志就是采JCL,解決了應用程序和框架日志不統一的問題,動態去尋找(應用程序配置)日志體系的實現。

默認的LogFactory是按照下列的步驟去發現并決定哪個日志工具將被使用的,LogFactory按照順序尋找,找到第一個工具后中止。

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

2、SLF4j(Simple Logging Facade for java)

 

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

與Common logging 不同的是其采用在ClassPath下尋找一下jar包來表示具體的采用哪種實現

  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 靜態綁定日志組件原理:

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

3、常見的日志組件

 

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

4. 適用場景

 

4.1 slf4j 使用log4j打印日志

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

JCL方式的common-logging 是動態查找綁定

SLF4j 是靜態綁定,需要加上橋接包,如 SLF4j-log4j2

可通過如下配置進行集成

  1. <!--slf4j門面 -->  
  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 日志庫提供的接口來打印日志,則還需要引入日志庫適配器,配置實例如下所示:

  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 模式,因為logback 自身實現了 slf4j的接口,無須額外引入適配器,另外,logback 是 log4j 的升級版,具備比log4j更多的優點,可通過如下配置進行集成:

  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

我們應用使用的是log4j2打印日志;而Spring采用的JCL中不包含log4j2,運行時,JCL從ClassPath下尋找日志的實現,如果沒有引用其他實現,最終會使用JUL實現。如下圖:

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

這時候會出現什么問題呢?

Spring打印日志和應用程序的打印日志不統一,錯誤排除還比較困難,而且應用程序和Spring框架,日志不統一,太亂了。

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

讓你10分鐘徹底了解Java中混亂的日志體系
  1. <dependencies>  
  2.         <!--slf4j門面 -->  
  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、優秀實踐

 

在使用SLF4J使用時,需要注意以下事項:

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

logger被定義為static 變量,是因為這個LOGGER與當前類綁定,避免每次都new一個新對象,造成資源浪費。

原文鏈接:https://www.toutiao.com/a6991357371033371139/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.好吊操| 99视频久久精品久久 | 国产成人亚洲精品91专区手机 | 4438全国免费观看 | 国自产精品手机在线视频 | 日本aa大片在线播放免费看 | 欧美一级艳片视频免费观看 | 91视频无限看 | 妇伦小说| 大逼美女 | 亚洲人成网站在线观看青青 | 亚洲 欧美 清纯 校园 另类 | 日韩日韩日韩手机看片自拍 | 精品视频中文字幕 | 欧洲一级黑寡妇 | 亚洲欧美日韩高清 | 麻生希无码 | 日韩一区二区三区精品 | 校花被拖到野外伦小说 | 欧美日本一道高清二区三区 | 艾秋果冻麻豆老狼 | 国产精品一久久香蕉产线看 | 狠狠插综合网 | 日韩视频在线精品视频免费观看 | 含羞草传媒一天免费看下 | 国产精品第2页 | 国产激情视频网站 | 色多多多 | 香蕉免费高清完整 | 蜜桃麻豆| 拍拍叫痛的无挡视频免费 | 男同桌脱我奶罩吸我奶作文 | 色综合久久九月婷婷色综合 | 成年人在线观看视频免费 | sss视频在线精品 | 我半夜摸妺妺的奶C了她软件 | 欧美vpswindows| 天天操天天舔 | 亚洲国产成人久久综合一区77 | 热99re久久精品国产首页 | 久久精品国产在热亚洲 |