Log4j-的簡介及基礎配置
資源連結
Log4j官網地址:
Log4j API 官方文件地址:
碼雲測試程式碼地址:
Log4j介紹
幾乎每個大型應用程式都包括自己的日誌記錄或跟蹤API。與此規則一致的是,歐盟SEMPER專案決定編寫自己的跟蹤API。這是在1996年初。經過無數的改進,API已經演變成log4j,這是一個流行的Java日誌包。這個包是在Apache Software許可證下發布的,這是一個完全成熟的開源許可證,由開放原始碼專案認證。最新的log4j版本,包括完整的原始碼,類檔案和文件可以在http://logging.apache.org/log4j/上找到。在此過程中,log4j已經被移植到C、C++、C、Perl、Python、Ruby和Eiffel語言中。
將日誌語句插入到程式碼中是一種低技術的除錯方法。這也可能是唯一的方法,因為偵錯程式並不總是可用或適用的。這通常適用於多執行緒應用程式和分散式應用程式。
經驗表明,日誌記錄是開發週期的重要組成部分。它提供了幾個優勢。它為應用程式的執行提供了精確的上下文。一旦插入到程式碼中,生成的日誌輸出就不需要人工干預了。此外,可以將日誌輸出儲存在永續性介質中,以便稍後進行研究。除了在開發週期中使用之外,還可以將一個足夠豐富的日誌包看作是一個審計工具。
日誌記錄確實有它的缺點。它可以降低應用程式的速度。如果太過冗長,就會導致滾動盲症。為了減輕這些問題,log4j被設計為可靠、快速和可擴充套件的。由於日誌記錄很少是應用程式的主要關注點,所以log4j API力求簡單易懂並使用。
日誌記錄器、應用程式和佈局
Log4j有三個主要元件:日誌記錄器、應用程式和佈局。這三種類型的元件協同工作,使開發人員能夠根據訊息型別和級別來記錄訊息,並在執行時控制這些訊息的格式以及報告的位置。
日誌記錄器
所有日誌API的第一個優點是,它比普通的System.out.println
好。它的功能是禁用某些日誌語句,同時允許其他人不受限制地列印。這個功能假設日誌空間,也就是所有可能的日誌記錄的空間,根據一些開發人員選擇的標準進行分類。在此之前,我們將選擇類別作為包的中心概念。然而,自從log4j版本1.2以來,Logger類已經取代了類別類。對於那些熟悉log4j早期版本的人來說,Logger類可以被認為僅僅是類別類的別名。
日誌記錄器可以被分為FATAL、ERROR、WARN、INFO、DEBUG、TRACE,這些級別是從高到低的級別。Log4j建議只使用四個級別,優先順序從高到低分別是 ERROR、WARN、INFO、DEBUG。通過在這裡定義的級別,您可以控制到應用程式中相應級別的日誌資訊的開關。比如在這裡定義了INFO級別, 則應用程式中所有DEBUG級別的日誌資訊將不被打印出來。程式會列印高於或等於所設定級別的日誌,設定的日誌等級越高,打印出來的日誌就越少。如果設定級別為INFO,則優先順序高於等於INFO級別(如:INFO、WARN、ERROR)的日誌資訊將可以被輸出,小於該級別的如DEBUG將不會被輸出。
輸出源和佈局
有選擇地啟用或禁用基於日誌記錄器的日誌請求的能力只是圖片的一部分。Log4j允許將日誌請求列印到多個目的地。在log4j語言中,輸出目的地稱為appender。目前,appender存在於控制檯、檔案、GUI元件、遠端套接字伺服器、JMS、NT事件記錄器和遠端UNIX Syslog守護程序中。還可以非同步地進行日誌記錄。
超過一個appender可以附加到一個日誌記錄器。
addAppender方法為給定的日誌記錄器添加了一個appender。對給定日誌記錄器的每個啟用日誌請求將被轉發到該日誌記錄器中的所有應用程式,以及層次結構中更高的應用程式。換句話說,應用程式繼承從記錄器層次結構繼承而來。例如,如果將一個控制檯appender新增到根日誌程式,那麼所有啟用的日誌請求將至少在控制檯上列印。如果添加了一個檔案appender,比如C,那麼啟用C和C的孩子的日誌請求將會在一個檔案和控制檯上列印。可以覆蓋此預設行為,從而使appender累積不再通過將新增性標誌設定為false來新增。
Log4j的使用
新增Maven依賴
log4j的使用比較的簡單,僅僅只是涉及到一個Maven依賴,如下:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
新增log4j.xml配置檔案
log4j的配置檔案由兩種格式,分別是log4j.properties以及log4j.xml,下面我是以最簡單的在控制檯中列印info級別的日誌資訊為例來進行說明。
log4j.xml原始碼:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration>
<!--輸出到控制檯-->
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %5p %t %-5l - %m%n"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="consoleAppender" />
</root>
</log4j:configuration>
新增測試類
Log4jTest原始碼:
package com.lyc.log4j;
import org.apache.log4j.Logger;
import org.junit.Test;
public class Log4jTest {
private static final Logger log = Logger.getLogger(Log4jTest.class);
@Test
public void testConsole(){
log.info("這裡是在控制檯中輸出的資訊。");
}
}
執行結果
2018-01-20 16:11:04 INFO main com.lyc.log4j.Log4jTest.testConsole(Log4jTest.java:13) - 這裡是在控制檯中輸出的資訊。
新增log4j.properties配置檔案
如果不新增log4j.xml那我們可以新增log4j.properties配置檔案,其功能與上面的示例是一樣的,配置檔案資訊如下:
log4j.rootCategory=INFO,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss} %5p %t %-5l - %m%n
對應的碼雲中的原始碼
注意資訊
No appenders could be found for logger
當專案中出現上述錯誤資訊時,其意思就是log4j查詢不到相應的配置檔案資訊,比如說我們這裡就是指查詢不到log4j.xml配置檔案資訊,解決的辦法是在呼叫處條件一條下面的指令:
BasicConfigurator.configure();
當我們新增上上面的資訊之後,log4j則啟用預設的配置檔案資訊,此時的完整程式碼如下:
package com.lyc.log4j;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.junit.Test;
public class Log4jTest {
private static final Logger log = Logger.getLogger(Log4jTest.class);
@Test
public void testConsole(){
BasicConfigurator.configure(); //自動快速地使用預設Log4j環境。
log.info("這裡是在控制檯中輸出的資訊。");
}
}
當log4j採用預設的配置檔案資訊時,其輸出的內容是這樣的:
0 [main] INFO com.lyc.log4j.Log4jTest - 這裡是在控制檯中輸出的資訊。