歡迎光臨
每天分享高質量文章

【轉】最詳細的Log4J使用教程

原文地址:

https://blog.csdn.net/evankaka/article/details/45815047

日誌是應用軟體中不可缺少的部分,Apache的開源專案log4j是一個功能強大的日誌組件,提供方便的日誌記錄。

在apache網站:jakarta.apache.org/log4j 可以免費下載到Log4j最新版本的軟體包。

一、入門實體

1、 新建一個Java工程,匯入Log4j包,pom檔案中對應的配置代碼如下:

  1.    log4j

  •    log4j

  •    1.2.17

  • 2、 resources目錄下創建log4j.properties檔案

    1. ### 設置###

    2. log4j.rootLogger = debug,stdout,D,E

    3. ### 輸出信息到控制抬 ###

    4. log4j.appender.stdout = org.apache.log4j.ConsoleAppender

    5. log4j.appender.stdout.Target = System.out

    6. log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

    7. log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

    8. ### 輸出DEBUG 級別以上的日誌到=/home/duqi/logs/debug.log ###

    9. log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

    10. log4j.appender.D.File = /home/duqi/logs/debug.log

    11. log4j.appender.D.Append = true

    12. log4j.appender.D.Threshold = DEBUG

    13. log4j.appender.D.layout = org.apache.log4j.PatternLayout

    14. log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

    15. ### 輸出ERROR 級別以上的日誌到=/home/admin/logs/error.log ###

    16. log4j.appender.E = org.apache.log4j.DailyRollingFileAppender

    17. log4j.appender.E.File =/home/admin/logs/error.log

    18. log4j.appender.E.Append = true

    19. log4j.appender.E.Threshold = ERROR

    20. log4j.appender.E.layout = org.apache.log4j.PatternLayout

    21. log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

    3、輸出日誌的例子如下

    1. package com.javadu.log;

    2. import org.slf4j.Logger;

    3. import org.slf4j.LoggerFactory;

    4. public class Log4JTest {

    5.    private static final Logger logger = LoggerFactory.getLogger(Log4JTest.class);

    6.    public static void main(String[] args) {

    7.        // 記錄debug級別的信息

    8.        logger.debug("This is debug message.");

    9.        // 記錄info級別的信息

    10.        logger.info("This is info message.");

    11.        // 記錄error級別的信息

    12.        logger.error("This is error message.");

    13.    }

    14. }

    4、輸出結果
    首先,控制台輸入如下圖所示:

    然後,查看/Users/duqi/logs目錄下的debug.log和error.log檔案,內容分別如下,可以看出,:

    • debug.log

    • error.log

    二、Log4J基本使用方法

    Log4j由三個重要的組件構成:日誌信息的優先級,日誌信息的輸出目的地,日誌信息的輸出格式。日誌信息的優先級從高到低有ERROR、WARN、 INFO、DEBUG,分別用來指定這條日誌信息的重要程度;日誌信息的輸出目的地指定了日誌將打印到控制台還是檔案中;而輸出格式則控制了日誌信息的顯 示內容

    2.1 定義配置檔案

    其實您也可以完全不使用配置檔案,而是在代碼中配置Log4j環境。但是,使用配置檔案將使您的應用程式更加靈活。Log4j支持兩種配置檔案格式,一種是XML格式的檔案,一種是Java特性檔案(鍵=值)。下麵我們介紹使用Java特性檔案做為配置檔案的方法:

    1. 配置根Logger

    其語法為:

    1. log4j.rootLogger = [ level ] , appenderName, appenderName, …

    其中,level 是日誌記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優 先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這裡定義的級別,您可以控制到應用程式中相應級別的日誌信息的開關。比如在這裡定 義了INFO級別,則應用程式中所有DEBUG級別的日誌信息將不被打印出來。 appenderName就是指把日誌信息輸出到哪個地方。您可以同時指定多個輸出目的地,例如上述例子我們制定了stdout、D和E這三個地方。

    2. 配置檔案的輸出目的地Appender

    一般,配置代碼的格式如下

    1. log4j.appender.appenderName = fully.qualified.name.of.appender.class  

    2. log4j.appender.appenderName.option1 = value1  

    3. …  

    4. log4j.appender.appenderName.option = valueN

    其中,Log4j提供的appender有以下幾種:

    • org.apache.log4j.ConsoleAppender(控制台),

    • org.apache.log4j.FileAppender(檔案),

    • org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案),

    • org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案),

    • org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)

    3. 配置日誌信息的格式(佈局)

    其語法為:

    1. log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class  

    2. log4j.appender.appenderName.layout.option1 = value1  

    3. …  

    4. log4j.appender.appenderName.layout.option = valueN

    其中,Log4j提供的layout有以下幾種:

    • org.apache.log4j.HTMLLayout(以HTML表格形式佈局),

    • org.apache.log4j.PatternLayout(可以靈活地指定佈局樣式),

    • org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字串),

    • org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等信息)

    Log4J採用類似C語言中的printf函式的打印格式格式化日誌信息,打印引數如下:

    • %m 輸出代碼中指定的訊息

    • %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL

    • %r 輸出自應用啟動到輸出該log信息耗費的毫秒數

    • %c 輸出所屬的類目,通常就是所在類的全名

    • %t 輸出產生該日誌事件的執行緒名

    • %n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”

    • %d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921

    • %l 輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)

    2.2 在代碼中使用Log4j

    1. 獲取記錄器

    使用Log4j,第一步就是獲取日誌記錄器,這個記錄器將負責控制日誌信息。其語法為: publicstaticLoggergetLogger(Stringname);通過指定的名字獲得記錄器,如果必要的話,則為這個名字創建一個新的記錄器。Name一般取本類的名字,比如: staticLoggerlogger=Logger.getLogger(ServerWithLog4j.class.getName())

    2. 讀取配置檔案

    當獲得了日誌記錄器之後,第二步將配置Log4j環境,其語法為:

    1. BasicConfigurator.configure (): 自動快速地使用預設Log4j環境。  

    2. PropertyConfigurator.configure ( String configFilename) :讀取使用Java的特性檔案編寫的配置檔案。  

    3. DOMConfigurator.configure ( String filename ) :讀取XML形式的配置檔案。

    3. 插入記錄信息(格式化日誌信息)

    當上兩個必要步驟執行完畢,您就可以輕鬆地使用不同優先級別的日誌記錄陳述句插入到您想記錄日誌的任何地方,其語法如下:

    1. Logger.debug ( Object message ) ;  

    2. Logger.info ( Object message ) ;  

    3. Logger.warn ( Object message ) ;  

    4. Logger.error ( Object message ) ;

    2.3 日誌級別

    每個Logger都被了一個日誌級別(log level),用來控制日誌信息的輸出。日誌級別從高到低分為:
    A:off 最高等級,用於關閉所有日誌記錄。
    B:fatal 指出每個嚴重的錯誤事件將會導致應用程式的退出。
    C:error 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
    D:warm 表明會出現潛在的錯誤情形。
    E:info 一般和在粗粒度級別上,強調應用程式的運行全程。
    F:debug 一般用於細粒度級別上,對除錯應用程式非常有幫助。
    G:all 最低等級,用於打開所有日誌記錄。

    上面這些級別是定義在org.apache.log4j.Level類中。Log4j只建議使用4個級別,優先級從高到低分別是error,warn,info和debug。通過使用日誌級別,可以控制應用程式中相應級別日誌信息的輸出。例如,如果使用b了info級別,則應用程式中所有低於info級別的日誌信息(如debug)將不會被打印出來。

    三、Spring中使用Log4J

    一般是在web.xml配置檔案中配置Log4j監聽器和log4j.properties檔案,代碼如下:

    1.   log4jConfigLocation

  •   classpath:/config/log4j.properties

  •   log4jRefreshInterval

  •   60000

  •   org.springframework.web.util.Log4jConfigListener

  • 在之前的Spring In Action系列文章中,我都是以Java Config檔案為例進行總結,則對應的Log4J的配置如下:

    1. //todo

    四、實戰經驗總結

    在商業專案中,日誌可用於資料化運營,需要記錄關鍵的業務資料;開發過程中必須準確記錄業務日誌,如果丟失業務資料則是很嚴重的故障。

    日誌信息的打印會影響到服務的性能(吞吐量和響應時間),在業務邏輯簡單的服務中更加明顯。舉個例子,我最近負責的一個會話管理的模塊,在性能壓測的時候發現TPS只能達到250左右,被這個問題困擾了很久。首先找出性能的瓶頸:快取操作和資料庫操作

    • 發現在快取操作中有一行打印日誌的陳述句使用了JSON庫,例如 JSON.toJsonString(obj),這個物件非常複雜,導致一個讀取快取的操作可以達到300ms左右,而實際上應該在10ms左右;

    • 發現資料庫操作非常耗時,但是經過分析,在系統穩定後,壓力並不是很大時,資料庫操作也比較正常;但是一旦併發數增高,則RT迅速增大,通過鏈路分析工具,查看在系統負載變高的過程中的指標發現CallAppenders()方法占據了將近40%以上的CPU時間,因此我才考慮到需要將日誌級別調整為ERROR級別——不打印DEBUG級別的日誌,至此,這個問題算是解決了。


    推薦一個我最近在學的JVM課程,來自Oracle高級研究員鄭宇迪在極客時間的JVM專欄,目前更新了12篇文章,我基本都跟下來了,質量值得信賴。

    整個專欄將分為四大模塊。

    1. 基本原理:剖析 Java 虛擬機的運行機制,逐一介紹 Java 虛擬機的設計決策以及工程實現;

    2. 高效實現:探索 Java 編譯器,以及內嵌於 Java 虛擬機中的即時編譯器,幫助你更好地理解 Java 語言特性,繼而寫出簡潔高效的代碼;

    3. 代碼優化:介紹如何利用工具定位並解決代碼中的問題,以及在已有工具不適用的情況下,如何打造專屬輪子;

    4. 虛擬機黑科技:介紹甲骨文實驗室近年來的前沿工作之一 GraalVM。包括如何在 JVM 上高效運行其他語言;如何混搭這些語言,實現 Polyglot;如何將這些語言事前編譯(Ahead-Of-Time,AOT)成機器指令,單獨運行甚至嵌入至資料庫中運行。

    赞(0)

    分享創造快樂

    © 2021 知識星球   网站地图