Java專案使用log4j和slf4j實現日誌列印
什麼是log4j?
Log4j是Apache的一個開源專案,通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件,甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護程序等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置檔案來靈活地進行配置,而不需要修改應用的程式碼。
什麼是slf4j?
SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。按照官方的說法,SLF4J是一個用於日誌系統的簡單Facade,允許終端使用者在部署其應用時使用其所希望的日誌系統。
實際上,SLF4J所提供的核心API是一些介面以及一個LoggerFactory的工廠類。從某種程度上,SLF4J有點類似JDBC,不過比JDBC更簡單,在JDBC中,你需要指定驅動程式,而在使用SLF4J的時候,不需要在程式碼中或配置檔案中指定你打算使用那個具體的日誌系統。如同使用JDBC基本不用考慮具體資料庫一樣,SLF4J提供了統一的記錄日誌的介面,只要按照其提供的方法記錄即可,最終日誌的格式、記錄級別、輸出方式等通過具體日誌系統的配置來實現,因此可以在應用中靈活切換日誌系統。
如果你開發的是類庫或者嵌入式元件,那麼就應該考慮採用SLF4J,因為不可能影響終端使用者選擇哪種日誌系統。在另一方面,如果是一個簡單或者獨立的應用,確定只有一種日誌系統,那麼就沒有使用SLF4J的必要。假設你打算將你使用log4j的產品賣給要求使用JDK 1.4 Logging的使用者時,面對成千上萬的log4j呼叫的修改,相信這絕對不是一件輕鬆的事情。但是如果開始便使用SLF4J,那麼這種轉換將是非常輕鬆的事情。
在Java專案中如何使用log4j和slf4j實現日誌列印?
第一步:新增相關jar包
- log4j-1.2.x.jar
- slf4j-api-1.x.x.jar
- slf4j-log4j12-1.x.x.jar
x-具體版本號
若是maven專案,pom.xml檔案中新增配置(x-具體版本號):
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.x</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.x</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.x</version> </dependency>
第二步:新增log4j配置檔案
在專案類路徑下新增log4j.properties配置檔案,具體內容如下:
### set log levels ###
log4j.rootLogger = DEBUG,stdout,D,E
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss} %l%m%n
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = F://logs/log.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
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =F://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
說明:
log4j.rootCategory=DEBUG, stdout , D,E
此句為將等級為INFO的日誌資訊輸出到stdout和D,E這三個目的地,stdout和D,E的定義在下面的程式碼,可以任意起名。等級可分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF則不打出任何資訊,如果配置為INFO這樣只顯示INFO, WARN, ERROR的log資訊,而DEBUG資訊不會被顯示。stdout和D,E定義的輸出日誌級別如log4j.appender.D.Threshold的值必須比log4j.rootLogger定義的級別高才生效。例如:log4j.rootLogger定義的級別為INFO,log4j.appender.D.Threshold定義的級別為DEBUG,D也只會輸出INFO以上級別的日誌。
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
此句為定義名為stdout的輸出端是哪種型別,可以是:
org.apache.log4j.ConsoleAppender(控制檯)
org.apache.log4j.FileAppender(檔案)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案)
org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)
org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
此句為定義名為stdout的輸出端的layout是哪種型別,可以是:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串)
org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊)
log4j.appender.stdout.layout.ConversionPattern= [%-5p] %d{yyyy-MM-dd HH:mm:ss} %l%m%n
如果使用pattern佈局就要指定的列印資訊的具體格式ConversionPattern,列印引數如下:
%p: 輸出日誌資訊優先順序,即DEBUG,INFO,WARN,ERROR,FATAL,
%r: 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c: 輸出日誌資訊所屬的類目,通常就是所在類的全名
%t: 輸出產生該日誌事件的執行緒名
%l: 輸出日誌事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main (TestLog4.Java:10)
%x: 輸出和當前執行緒相關聯的NDC(巢狀診斷環境),尤其用到像Java servlets這樣的多客戶多執行緒的應用中。
%%: 輸出一個"%"字元
%F: 輸出日誌訊息產生時所在的檔名稱
%L: 輸出程式碼中的行號
%m: 輸出程式碼中指定的訊息,產生的日誌具體資訊 %n: 輸出一個回車換行符,Windows平臺為"/r/n",Unix平臺為"/n"輸出日誌資訊換行
%d: 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式
第三步:在專案的web.xml檔案中新增log4j配置
<!-- log4j配置檔案位置 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<!-- 利用spring來使用log4j -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
第四步:在類中新增日誌
// 匯入slf4j類
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// 新增slf4j日誌例項物件
private final static Logger logger = LoggerFactory.getLogger(Test.class);
// 輸出日誌
logger.info("輸出日誌");