原文地址:
https://blog.csdn.net/evankaka/article/details/45815047
日誌是應用軟體中不可缺少的部分,Apache的開源專案log4j是一個功能強大的日誌元件,提供方便的日誌記錄。
在apache網站:jakarta.apache.org/log4j 可以免費下載到Log4j最新版本的軟體包。
一、入門實體
1、 新建一個Java工程,匯入Log4j包,pom檔案中對應的配置程式碼如下:
log4j
2、 resources目錄下建立log4j.properties檔案
### 設定###
log4j.rootLogger = debug,stdout,D,E
### 輸出資訊到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 輸出DEBUG 級別以上的日誌到=/home/duqi/logs/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /home/duqi/logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 輸出ERROR 級別以上的日誌到=/home/admin/logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/home/admin/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
3、輸出日誌的例子如下
package com.javadu.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Log4JTest {
private static final Logger logger = LoggerFactory.getLogger(Log4JTest.class);
public static void main(String[] args) {
// 記錄debug級別的資訊
logger.debug("This is debug message.");
// 記錄info級別的資訊
logger.info("This is info message.");
// 記錄error級別的資訊
logger.error("This is error message.");
}
}
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
其語法為:
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
一般,配置程式碼的格式如下
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
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. 配置日誌資訊的格式(佈局)
其語法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
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環境,其語法為:
BasicConfigurator.configure (): 自動快速地使用預設Log4j環境。
PropertyConfigurator.configure ( String configFilename) :讀取使用Java的特性檔案編寫的配置檔案。
DOMConfigurator.configure ( String filename ) :讀取XML形式的配置檔案。
3. 插入記錄資訊(格式化日誌資訊)
當上兩個必要步驟執行完畢,您就可以輕鬆地使用不同優先順序別的日誌記錄陳述句插入到您想記錄日誌的任何地方,其語法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
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檔案,程式碼如下:
log4jConfigLocation
在之前的Spring In Action系列文章中,我都是以Java Config檔案為例進行總結,則對應的Log4J的配置如下:
//todo
四、實戰經驗總結
在商業專案中,日誌可用於資料化運營,需要記錄關鍵的業務資料;開發過程中必須準確記錄業務日誌,如果丟失業務資料則是很嚴重的故障。
日誌資訊的列印會影響到服務的效能(吞吐量和響應時間),在業務邏輯簡單的服務中更加明顯。舉個例子,我最近負責的一個會話管理的模組,在效能壓測的時候發現TPS只能達到250左右,被這個問題困擾了很久。首先找出效能的瓶頸:快取操作和資料庫操作
-
發現在快取操作中有一行列印日誌的陳述句使用了JSON庫,例如
JSON.toJsonString(obj)
,這個物件非常複雜,導致一個讀取快取的操作可以達到300ms左右,而實際上應該在10ms左右; -
發現資料庫操作非常耗時,但是經過分析,在系統穩定後,壓力並不是很大時,資料庫操作也比較正常;但是一旦併發數增高,則RT迅速增大,透過鏈路分析工具,檢視在系統負載變高的過程中的指標發現CallAppenders()方法佔據了將近40%以上的CPU時間,因此我才考慮到需要將日誌級別調整為ERROR級別——不列印DEBUG級別的日誌,至此,這個問題算是解決了。
推薦一個我最近在學的JVM課程,來自Oracle高階研究員鄭宇迪在極客時間的JVM專欄,目前更新了12篇文章,我基本都跟下來了,質量值得信賴。
整個專欄將分為四大模組。
-
基本原理:剖析 Java 虛擬機器的執行機制,逐一介紹 Java 虛擬機器的設計決策以及工程實現;
-
高效實現:探索 Java 編譯器,以及內嵌於 Java 虛擬機器中的即時編譯器,幫助你更好地理解 Java 語言特性,繼而寫出簡潔高效的程式碼;
-
程式碼最佳化:介紹如何利用工具定位並解決程式碼中的問題,以及在已有工具不適用的情況下,如何打造專屬輪子;
-
虛擬機器黑科技:介紹甲骨文實驗室近年來的前沿工作之一 GraalVM。包括如何在 JVM 上高效執行其他語言;如何混搭這些語言,實現 Polyglot;如何將這些語言事前編譯(Ahead-Of-Time,AOT)成機器指令,單獨執行甚至嵌入至資料庫中執行。