apache--log4j.properties的配置及載入應用

happyAliceYu發表於2017-03-15

一、介紹 
1)Log4j是Apache的一個開放原始碼專案,通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件、甚至是套介面服務 器、NT的事件記錄器、UNIX Syslog守護程式等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。 
Log4j由三個重要的元件構成:日誌資訊的優先順序,日誌資訊的輸出目的地,日誌資訊的輸出格式日誌資訊的優先順序從高到低有ERROR、WARN、 INFO、DEBUG,分別用來指定這條日誌資訊的重要程度;日誌資訊的輸出目的地指定了日誌將列印到控制檯還是檔案中;而輸出格式則控制了日誌資訊的顯示內容。 
2)Log4j建議只使用四個級別,優先順序從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這裡定義的級別,您可以控制到應用程式中相應級別的日誌資訊的開關。 
比如在這裡定義了INFO級別,則應用程式中所有DEBUG級別的日誌資訊將不被列印出來。 
程式會列印高於或等於所設定級別的日誌,設定的日誌等級越高,列印出來的日誌就越少。 
如果設定級別為INFO,則優先順序高於等於INFO級別(如:INFO、WARN、 
ERROR)的日誌資訊將可以被輸出,小於該級別的如DEBUG將不會被輸出。
二、配置檔案 
其實您也可以完全不使用配置檔案,而是在程式碼中配置Log4j環境。但是,使用配置檔案將使您的應用程式更加靈活。 
Log4j支援兩種配置檔案格式,一種是XML格式的檔案,一種是properties格式的檔案。下面我們介紹使用properties格式做為配置檔案的方法: 
示例: 
log4j.rootLogger=INFO, A1 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n 

1. 配置根Logger,其語法為: 
log4j.rootLogger = [ level ] , appenderName, appenderName, … 
其中,level 是日誌記錄的優先順序,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優先順序從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這裡定義的級別,您可以控制到應用程式中相應級別的日誌資訊的開關。比如在這裡定義了INFO級別,則應用程式中所有DEBUG級別的日誌資訊將不被列印出來。 
appenderName就是指定日誌資訊輸出到哪個地方。您可以同時指定多個輸出目的地。 

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(將日誌資訊以流格式傳送到任意指定的地方) 
(1).ConsoleAppender選項 
Threshold=WARN:指定日誌訊息的輸出最低層次。 
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 
Target=System.err:預設情況下是:System.out,指定輸出控制檯 
(2).FileAppender 選項 
Threshold=WARN:指定日誌訊息的輸出最低層次。 
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 
File=mylog.txt:指定訊息輸出到mylog.txt檔案。 
Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。 
(3).DailyRollingFileAppender 選項 
Threshold=WARN:指定日誌訊息的輸出最低層次。 
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 
File=mylog.txt:指定訊息輸出到mylog.txt檔案。 
Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。 
DatePattern=’.'yyyy-ww:每週滾動一次檔案,即每週產生一個新的檔案。當然也可以指定按月、周、天、時和分。即對應的格式如下: 
  1)’.'yyyy-MM: 每月 
  2)’.'yyyy-ww: 每週 
  3)’.'yyyy-MM-dd: 每天 
  4)’.'yyyy-MM-dd-a: 每天兩次 
  5)’.'yyyy-MM-dd-HH: 每小時 
  6)’.'yyyy-MM-dd-HH-mm: 每分鐘 
(4).RollingFileAppender 選項 
Threshold=WARN:指定日誌訊息的輸出最低層次。 
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 
File=mylog.txt:指定訊息輸出到mylog.txt檔案。 
Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。 
MaxFileSize=100KB: 字尾可以是KB, MB 或者是 GB. 在日誌檔案到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1檔案。 
MaxBackupIndex=2:指定可以產生的滾動檔案的最大數。 

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(包含日誌產生的時間、執行緒、類別等等資訊) 

4、輸出格式設定 
在配置檔案中可以通過log4j.appender.A1.layout.ConversionPattern設定日誌輸出格式。 
引數: 
%p: 輸出日誌資訊優先順序,即DEBUG,INFO,WARN,ERROR,FATAL, 
%d: 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921 
%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”輸出日誌資訊換行 
可以在%與模式字元之間加上修飾符來控制其最小寬度、最大寬度、和文字的對齊方式。如: 
1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,預設的情況下右對齊。 
2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,”-”號指定左對齊。 
3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大於30的話,就會將左邊多出的字元截掉,但小於30的話也不會有空格。 
4)%20.30c:如果category的名稱小於20就補空格,並且右對齊,如果其名稱長於30字元,就從左邊交遠銷出的字元截掉。

5)日誌的優先順序別在配置檔案中進行設定

5 設定package輸出級別

可以設定不同package的日誌輸出級別,語法為:
log4j.logger.packageName=level
其中,packageName為實際的包名,level為日誌級別,例如:

複製程式碼程式碼如下:

log4j.logger.org.springframework=info
log4j.logger.org.apache.catalina=info
log4j.logger.org.apache.commons.digester.Digester=info
log4j.logger.org.apache.catalina.startup.TldConfig=info
log4j.logger.chb.test=debug


三、載入log4j.properties檔案

 1、spring方式載入,配置與web.xml中:

Spring載入log4j.properties,它提供了一個Log4jConfigListener,本身就能通過web.xml配置從指定位置載入log4j配置檔案和log4j的輸出路徑,要注意的是

Log4jConfigListener必須要在Spring的Listener之前。

web.xml

<!-- 設定由Sprng載入的Log4j配置檔案位置 -->

<context-param> 

    <param-name>log4jConfigLocation</param-name> 

    <param-value>WEB-INF/classes/log4j.properties</param-value> 

</context-param> 

  <!-- Spring重新整理Log4j配置檔案變動的間隔,單位為毫秒 -->

<context-param> 

    <param-name>log4jRefreshInterval</param-name> 

    <param-value>10000</param-value> 

</context-param> 

 

<listener> 

    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 

</listener>

2、可以通過架包自動攔截並載入

log4j-1.2.17.jar下面的LogManager.class類中對log4j.properties檔案進行攔截並載入

public   class  類名{
       Logger logger 
 =  Logger.getLogger(TestLog4j. class  
);
       logger.debug(
 " debug " 
);
        logger.error(
 " error " 
);
}

 

四、在程式中的使用 
在程式中使用Log4j之前,首先要將commons-logging.jar和logging-log4j-1.2.9.jar匯入到classpath中,並將log4j.properties放於src根目錄中。接下來就可以使用了。 

1.得到記錄器 
使用Log4j,第一步就是獲取日誌記錄器,這個記錄器將負責控制日誌資訊。其語法為: 
public static Logger getLogger( String name), 
通過指定的名字獲得記錄器,如果必要的話,則為這個名字建立一個新的記錄器。Name一般取本類的名字,比如: 
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ; 
注:推薦使用commons-logging結合log4j進行日誌記錄 
private static Log logger = LogFactory.getLog(Yourclass.class);
 

2.插入記錄資訊(格式化日誌資訊) 
當上兩個必要步驟執行完畢,您就可以輕鬆地使用不同優先順序別的日誌記錄語句插入到您想記錄日誌的任何地方,其語法如下: 
Logger.debug ( Object message ) ; 
Logger.info ( Object message ) ; 
Logger.warn ( Object message ) ; 
Logger.error ( Object message ) ; 

例如:

  org.apache.log4j.*;  
   LogTest ...{    
      Logger logger = Logger.getLogger(LogTest..getName());  
        main(String[] args) ...{
	//通過PropertyConfigurator載入log4j.properties檔案,如果不新增這句話,則有spring載入  
         PropertyConfigurator.configure ( “.\srclog4j.properties”);
          logger.debug("Debug ...");
  
         logger.info("Info ...");
  
         logger.warn("Warn ...");
  
         logger.error("Error ...");
 
     }
 }

相關文章