0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

日志框架簡介-Slf4j+Logback入門實踐

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-07-30 10:00 ? 次閱讀

前言

隨著互聯(lián)網(wǎng)和大數(shù)據(jù)的迅猛發(fā)展,分布式日志系統(tǒng)和日志分析系統(tǒng)已廣泛應用,幾乎所有應用程序都使用各種日志框架記錄程序運行信息。因此,作為工程師,了解主流的日志記錄框架非常重要。雖然應用程序的運行結(jié)果不受日志的有無影響,但沒有日志的應用程序是不完整的,甚至可以說是有缺陷的。優(yōu)秀的日志系統(tǒng)可以記錄操作軌跡、監(jiān)控系統(tǒng)運行狀態(tài)解決系統(tǒng)故障。

Java 日志框架進化史

早期 Java 日志框架沒有制定統(tǒng)一的標準,使得很多應用程序會同時使用多種日志框架。Java 日志框架的發(fā)展歷程大致可分為以下幾個階段:

wKgZomandamADVaeAADrIxKpkeI928.jpg

1.Log4j:Apache Log4j是一種基于Java的日志記錄工具。該項目由Ceki Gülcü于1999年創(chuàng)建,并幾乎成為了Java日志框架的實際標準。

2.JUL:Apache 希望將 Log4j 引入 jdk,不過被 sun 公司拒絕了。隨后,sun 模仿 Log4j,在 jdk1.4 中引入了 JUL(java.util.logging)。

3.Commons Logging:為了解耦日志接口與實現(xiàn),Apache在2002年推出了JCL(Jakarta Commons Logging)。JCL定義了一套日志接口,具體的實現(xiàn)由Log4j或JUL完成。Commons Logging使用動態(tài)綁定來實現(xiàn)日志記錄,編碼時只需要使用它定義的接口即可,程序運行時會使用ClassLoader來查找和加載底層的日志庫,因此可以靈活選擇Log4j或JUL來實現(xiàn)日志功能。

4.Slf4j&Logback:Ceki Gülcü與Apache基金會在Commons-Logging標準上存在分歧。后來,Ceki Gülcü離開了Apache,并創(chuàng)建了Slf4j和Logback兩個項目。Slf4j是一個日志門面,僅提供接口,可以支持Logback、JUL、log4j等日志實現(xiàn)。而Logback則提供了具體的實現(xiàn)。相比于log4j,Logback具有更快的執(zhí)行速度和更完善的功能。

5.Log4j 2:為了保持在Java日志領(lǐng)域的地位,防止JCL和Log4j被Slf4j和Logback取代,Apache在2014年推出了Log4j 2。Log4j 2與log4j不兼容,經(jīng)過大量深度優(yōu)化,其性能得到顯著提升。

日志框架介紹

在上文中已經(jīng)提及,目前常用的日志框架有 Log4j,Log4j 2,Commons Logging,Slf4j,Logback,JUL。這些日志框架可以分為兩種類型:門面日志和日志系統(tǒng)。

日志門面

日志門面(Logging Facade)是一種設計模式,用于在應用程序中實現(xiàn)日志記錄的抽象層。它提供了一組統(tǒng)一的接口和方法,即相應的 API,而不提供具體的接口實現(xiàn)。日志門面在使用時,可以動態(tài)或者靜態(tài)地指定具體的日志框架實現(xiàn),解除了接口和實現(xiàn)的耦合,使用戶可以靈活地選擇日志的具體實現(xiàn)框架。

日志系統(tǒng)

日志系統(tǒng)(Logging System)是指用于記錄和管理應用程序運行時產(chǎn)生的日志信息的軟件工具或框架。與日志門面相對,它提供了具體的日志接口實現(xiàn),應用程序通過它執(zhí)行日志打印的功能,如日志級別管理、日志格式化、日志輸出目標設置等。常見的日志系統(tǒng)包括Log4j、Logback、Java Util Logging等。

wKgaomandamAZ0mSAACXshr4Kag764.jpg

通過使用日志門面,我們可以在應用程序中使用統(tǒng)一的API進行日志記錄,而具體的日志實現(xiàn)可以根據(jù)需要選擇和配置。這樣,我們可以根據(jù)項目需求和團隊喜好來靈活選擇、切換和配置日志系統(tǒng),而不會對應用程序代碼造成太大影響。

避免環(huán)形依賴

Slf4j 的作者 Ceki Gülcü 當年因為覺得 Commons-Logging 的 API 設計的不好,性能也不夠高,因而設計了 Slf4j。而他為了 Slf4j 能夠兼容各種類型的日志系統(tǒng)實現(xiàn),還設計了相當多的 adapter 和 bridge 來連接,如下圖所示:

wKgZomandaqAEE-TAAEa1fU9SK4082.jpg

鑒于此,在引入日志框架依賴的時候要盡力避免,比如以下組合就不能同時出現(xiàn):

?jcl-over-slf4j 和 slf4j-jcl

?log4j-over-slf4j 和 slf4j-log4j12

?jul-to-slf4j 和 slf4j-jdk14

日志框架的使用選擇

常用的組合使用方式是 Slf4j & Logback 組合使用,Commons Logging & Log4j 組合使用。

推薦

Slf4j & Logback

原因

1. Slf4j 實現(xiàn)機制決定 Slf4j 限制較少,使用范圍更廣。相較于 Commons-Logging,Slf4j 在編譯期間便靜態(tài)綁定本地的 Log 庫,其通用性要好得多;

2. Logback 擁有更好的性能。Logback 聲稱:某些關(guān)鍵操作,比如判定是否記錄一條日志語句的操作,其性能得到了顯著的提高,這個操作在 Logback 中只需 3 ns,而在 Log4j 則需要 30 ns;

3. Slf4j 支持參數(shù)化,使用占位符號,代碼更為簡潔,如下例子:

// 在使用 Commons-Logging 時,通常的做法是 
if(log.isDebugEnabled()){ 
    log.debug("User name: " + user.getName() + " buy goods id :" + good.getId()); 
} 

// 在 Slf4j 陣營,你只需這么做: 
log.debug("User name:{} ,buy goods id :{}", user.getName(),good.getId());

4. Logback 的所有文檔是免費提供的,Log4j 只提供部分免費文檔而需要用戶去購買付費文檔;

5. MDC (Mapped Diagnostic Contexts) 用 Filter,將當前用戶名等業(yè)務信息放入 MDC 中,在日志 format 定義中即可使用該變量。具體而言,在診斷問題時,通常需要打出日志。如果使用 Log4j,則只能降低日志級別,但是這樣會打出大量的日志,影響應用性能;如果使用 Logback,保持原定日志級別而過濾某種特殊情況,如 Alice 這個用戶登錄,日志將打在 DEBUG 級別而其它用戶可以繼續(xù)打在 WARN 級別。實現(xiàn)這個功能只需加 4 行 XML 配置;

6. 自動壓縮日志。RollingFileAppender 在產(chǎn)生新文件的時候,會自動壓縮已經(jīng)打出來的日志文件。壓縮過程是異步的,因此在壓縮過程中應用幾乎不會受影響。

Slf4j+Logback入門實踐

maven依賴

pom.xml



    org.slf4j
    slf4j-api



    ch.qos.logback
    logback-classic



    ch.qos.logback
    logback-core




    org.projectlombok
    lombok
    1.18.16

配置文件

logback.xml




    
    

    
    
        
            ${CONSOLE_LOG_PATTERN}
        
    

    
    
        ${LOG_PATH}/${LOG_FILE}-info.log
        true
        
            INFO
            ACCEPT
            NEUTRAL
        
        
            ${LOG_PATH}/${LOG_FILE}-info-%d{yyyy-MM-dd}.%i.log 
            
                200MB 
            
            15 
            2GB 
            true 
        
        
            ${FILE_LOG_PATTERN}
        
    

    
    
        ${LOG_PATH}/${LOG_FILE}-warn.log
        true
        
            WARN
            ACCEPT
            DENY
        
        
            ${LOG_PATH}/${LOG_FILE}-warn-%d{yyyy-MM-dd}.%i.log 
            
                200MB 
            
            15 
            2GB 
            true 
        
        
            ${FILE_LOG_PATTERN}
        
    

    
    
        ${LOG_PATH}/${LOG_FILE}-error.log
        true
        
            ERROR
            ACCEPT
            DENY
        
        
            ${LOG_PATH}/${LOG_FILE}-error-%d{yyyy-MM-dd}.%i.log
            
                200MB
            
            15
            2GB
            true
        
        
            ${FILE_LOG_PATTERN}
        
    

    
    
        
        512 
    
    
        
        512 
    
    
        
        512
    

    
    
        
        
        
        
    


    
    
        
        
        
        
    

applicantion.properties

logging.file=fuqige-bronze
logging.path=XXXXXX/Logs/XXXXXX
logging.level.root=info
logging.level.com.improve.fuqige.bronze=info
logging.pattern.console=%cyan(%d{yyyy-MM-dd HH:mm:ss.SSS}) %yellow([%thread]) %highlight(%-5level) %boldGreen(%logger{80}[LineNumber:%L]): %highlight(%msg%n)
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] %-5level --- [%thread] %logger{80}[LineNumber:%L]: %msg%n

測試用例

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/hello")
    public String hello() {
        log.info("進來了!");
        log.warn("進來了!");
        log.error("進來了!");
        return "hello, world! requestId=" + MDC.get("requestId");
    }
}

參考資料

Java 日志框架:
https://zhuanlan.zhihu.com/p/365154773

SLF4J框架常見的用法和最佳實踐:
https://juejin.cn/post/7215569601161166906

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    397

    瀏覽量

    17358
  • logback
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    892
收藏 人收藏

    評論

    相關(guān)推薦

    slf4j打印日志必須的三個依賴包相關(guān)資料推薦

    1、slf4j打印日志必須的三個依賴包  日志相關(guān)包 slf4j打印日志必須的三個依賴包  slf4j
    發(fā)表于 10-19 14:57

    TDK貼片電感規(guī)格書—SLF系列

    Type: Issue date: SLF6025 (6.0x6.0 mm) SLF6028 (6.0x6.0 mm) SLF6045 (6.0x6.0 mm) SLF7032 (7.
    發(fā)表于 10-26 17:23 ?194次下載
    TDK貼片電感規(guī)格書—<b class='flag-5'>SLF</b>系列

    java 日志框架Spring Boot分析

    應用程序中輸出相應的日志。 在傳統(tǒng)Java應用程序中,我們一般會使用類似Log4j這樣的日志框架來輸出日志,而不是直接在代碼中通過Syste
    發(fā)表于 09-28 14:58 ?0次下載

    logback異常輸出詳細信息(調(diào)用堆棧)分析

     Logback是一個開源的日志組件,是log4j的作者開發(fā)的用來替代log4j的。logback由三個部分組成,
    發(fā)表于 11-28 16:31 ?8233次閱讀

    基于時間卷積網(wǎng)絡的通用日志序列異常檢測框架

    基于循環(huán)神經(jīng)網(wǎng)絡的日志序列異常檢測模型對短序列有較好的檢測能力,但對長序列的檢測準確性較差。為此,提出一種基于時間卷積網(wǎng)絡的通用日志序列異常檢測框架。將日志模板序列建模為自然語言序列,
    發(fā)表于 03-30 10:29 ?8次下載
    基于時間卷積網(wǎng)絡的通用<b class='flag-5'>日志</b>序列異常檢測<b class='flag-5'>框架</b>

    Java日志框架中的王者是誰

    不及Apache 的新一代日志框架 - Log4j 目前來看,Log4j2 就是王者,其他日志框架
    的頭像 發(fā)表于 10-13 09:12 ?1311次閱讀

    GitHub入門實踐

    GitHub入門實踐
    發(fā)表于 11-21 10:40 ?0次下載

    java日志框架 java日志配置等需要注意的幾個方面

    前言 1. 日志框架眾多,兼容問題 2. 日志配置復雜,容易出錯 3. 日志異步亂用,導致日志錯亂 4
    的頭像 發(fā)表于 11-15 16:13 ?948次閱讀

    委派模式——從SLF4J說起

    SLF4J全稱"Simple Logging Facade for Java (SLF4J) ", 它誕生之初的目的,是為了針對不同的log解決方案,提供一套統(tǒng)一的接口適配標準,從而讓業(yè)務代碼無須關(guān)心使用到的第三方模塊都使用了哪些log方案。
    的頭像 發(fā)表于 01-31 15:12 ?466次閱讀

    如何復現(xiàn)Log4j2漏洞

    ApacheLog4j2是一個開源的Java日志框架,被廣泛地應用在中間件、開發(fā)框架與Web應用中。
    的頭像 發(fā)表于 02-13 10:55 ?1316次閱讀

    頂級Javaer都在使用的類庫!

    日志庫非常常見,因為您在每個項目中都需要它們。它們對于服務器端應用程序來說是最重要的,因為日志只放置在您可以看到應用程序正在發(fā)生什么的地方。盡管 JDK 附帶了自己的日志庫,但仍有更好的替代方案可用,例如 Log
    的頭像 發(fā)表于 02-16 10:11 ?553次閱讀

    log4j日志框架分析

    og4j是Apache下的一款開源的日志框架,能夠滿足我們在項目中對于日志記錄的需求。log4j提供了簡單的API調(diào)用,強大的
    的頭像 發(fā)表于 02-28 14:32 ?1044次閱讀
    log<b class='flag-5'>4j</b><b class='flag-5'>日志</b><b class='flag-5'>框架</b>分析

    Spring Boot的日志框架使用

    目前市面上常見的日志框架有:slf4j(Simple Logging Facade for Java)、logback、log4j、log
    的頭像 發(fā)表于 06-02 10:59 ?882次閱讀
    Spring Boot的<b class='flag-5'>日志</b><b class='flag-5'>框架</b>使用

    深度學習框架pytorch入門實踐

    深度學習框架pytorch入門實踐 深度學習是機器學習中的一個分支,它使用多層神經(jīng)網(wǎng)絡對大量數(shù)據(jù)進行學習,以實現(xiàn)人工智能的目標。在實現(xiàn)深度學習的過程中,選擇一個適用的開發(fā)框架是非常關(guān)
    的頭像 發(fā)表于 08-17 16:03 ?1506次閱讀

    保護Log4j日志中的敏感數(shù)據(jù),兩步搞定!

    log4j在準備添加日志消息時調(diào)用此方法。在MaskingAppender類中,我們覆蓋這個方法來攔截日志消息,使用maskSensitiveData()方法對敏感數(shù)據(jù)應用masking,然后將修改后的消息傳遞給超類的appen
    的頭像 發(fā)表于 10-18 16:03 ?661次閱讀