log4j

參考連接: http://www.iteye.com/topic/378077 html

推薦使用1.2.X版,下載地址:java

http://logging.apache.org/log4j/1.2/download.html web

若是使用Maven管理項目, 添加maven依賴sql

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>provided</scope>
        </dependency>

 

1、入門實例

1.新建一個Java工程,導入包log4j-1.2.17.jar,整個工程最終目錄以下數據庫

二、src同級建立並設置log4j.propertiesapache

    類在編譯的時候log4j.jar默認的狀況是到classpath下查找默認的配置文件log4j.properties。 把log4j.properteis放到src目錄下面, 在編譯後會自動把配置文件複製到classpath。 這樣就能夠找到配置文件。 多線程

### 設置###oracle

log4j.rootLogger = debug,stdout,FILE,E
### 設置根logger ###
log4j.rootLogger = debug, stdout, FILE, E
 
### 設置輸出信息到stdout ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.encoding = UTF-8
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p]%l - %m%n
 
### 輸出DEBUG級別信息到 ./result/log/debug.log ###
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File = ./result/log/debug.log
log4j.appender.FILE.encoding = UTF-8
log4j.appender.FILE.Append = false
log4j.appender.FILE.Threshold = DEBUG
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d-%-4r [%t]%-5p%l %x- %m%n
 
### 輸出ERROR 級別以上的日誌到./result/log/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = ./result/log/debug.log
log4j.appender.E.encoding = UTF-8
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %d-%-4r [%t]%-5p%l %x- %m%n

三、設置日誌內容app

package com.mucfc;
import org.apache.log4j.Logger;
/**
 *@author linbingwen
 *@2015年5月18日9:14:21
 */
public class Test {
 private static Logger logger = Logger.getLogger(Test.class);  
    public static void main(String[] args) {  
        // System.out.println("This is println message.");  
        // 記錄debug級別的信息  
        logger.debug("This is debug message.");  
        // 記錄info級別的信息  
        logger.info("This is info message.");  
        // 記錄error級別的信息  
        logger.error("This is error message.");  
    }  
}

四、輸出結果socket

(1)首先是控制檯的信息

(2)再來看輸出的文件

內容以下,發現已按照要求輸出到對應的文檔中去了。

 經過配置文件可知,咱們須要配置3個方面的內容:

一、根目錄(級別和目的地);

二、目的地(控制檯、文件等等);

三、輸出樣式。

Log4J的類圖:主要由三大組件組成:loggers,appenders和layouts

2、Log4j基本使用方法

2.一、定義配置文件

其實您也能夠徹底不使用配置文件,而是在代碼中配置Log4j環境。可是,使用配置文件將使您的應用程序更加靈活。Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。下面咱們介紹使用Java特性文件作爲配置文件的方法:
1. 配置根Logger,其語法爲:

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

其中,level 是日誌記錄的優先級,分爲OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。

    日誌級別從高到低分爲:
A:off 最高等級,用於關閉全部日誌記錄。
B:fatal 指出每一個嚴重的錯誤事件將會致使應用程序的退出。
C:error 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
D:warn 代表會出現潛在的錯誤情形。
E:info 通常和在粗粒度級別上,強調應用程序的運行全程。
F:debug 通常用於細粒度級別上,對調試應用程序很是有幫助。

G:all 最低等級,用於打開全部日誌記錄。

        Log4j建議只使用四個級別,優 先級從高到低分別是ERROR、WARN、INFO、DEBUG。經過在這裏定義的級別,您能夠控制到應用程序中相應級別的日誌信息的開關。好比在這裏定 義了INFO級別,則應用程序中全部DEBUG級別的日誌信息將不被打印出來。 appenderName就是指日誌信息輸出到哪一個地方。您能夠同時指定多個輸出目的地。

配置自定義Logger組件的語法爲:

log4j.logger.loggerName=[priority],appenderName,appenderName,...-

log4j.rootLogger=INFO,stdout,R

 此句爲將等級爲INFO的日誌信息輸出到stdout和R這兩個目的地,stdout和R的定義在下面的代碼,能夠任意起名。

2.配置日誌信息輸出目的地Appender 

appender的任務是把layout格式化好的輸出內容送往指定的目的地。每一個appender都和一個layout相聯繫, 
layout的任務是格式化用戶的logging request。其語法爲:

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

log4j.appender.appenderName.option1 = value1 … 

log4j.appender.appenderName.option = valueN
 
好比:
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File = ./result/log/debug.log
log4j.appender.FILE.encoding = UTF-8
log4j.appender.FILE.Append = false
log4j.appender.FILE.Threshold = DEBUG
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d-%-4r [%t]%-5p%l %x- %m%n
 
    

其中,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:指定日誌消息的輸出最低層次。
Append=false:默認值是true,即將消息增長到指定文件中,false指將消息覆蓋指定的文件內容。
encoding = UTF-8 設置輸出log的編碼格式
ImmediateFlush=true:默認值是true,意謂着全部的消息都會被當即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。

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有以e幾種:

  • org.apache.log4j.HTMLLayout(以HTML表格形式佈局) 
  • org.apache.log4j.PatternLayout(能夠靈活地指定佈局模式)  
  • org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串) 
  • org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)

Log4J採用相似C語言中的printf函數的打印格式格式化日誌信息,打印參數以下: %m 輸出代碼中指定的消息 

log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

若是使用pattern佈局就要指定的打印信息的具體格式ConversionPattern,打印參數以下:

l   [QC]是log信息的開頭,能夠爲任意字符,例如項目簡稱。

l   %p: 輸出日誌信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL,

l   %d: 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss,SSS},輸出相似:2002年10月18日 22:10:28,921

l   %r: 輸出自應用啓動到輸出該log信息耗費的毫秒數

l   %c: 輸出日誌信息所屬的類目,一般就是所在類的全名

l   %t: 輸出產生該日誌事件的線程名

l   %l: 輸出日誌事件的發生位置,至關於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main (TestLog4.java:10)

l   %x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤爲用到像java servlets這樣的多客戶多線程的應用中。

l   %%: 輸出一個"%"字符

l   %F: 輸出日誌消息產生時所在的文件名稱

l   %L: 輸出代碼中的行號

l   %m: 輸出代碼中指定的消息,產生的日誌具體信息

l   %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字符,就從左邊較遠輸出的字符截掉。 

2.二、在代碼中使用Log4j

1.獲得記錄器

使用Log4j,第一步就是獲取日誌記錄器,這個記錄器將負責控制日誌信息。其語法爲: 

  • public static Logger getLogger(String name) 
  • public staticLogger Logger.getLogger(Class clazz)至關於調用Logger.getLogger(clazz.getName()),該方法被認爲是目前所知的最理智的命名logger的方法。

    private final static Logger logger = Logger.getLogger(BaseParpare.class.getName());
 

2.讀取配置文件

當得到了日誌記錄器以後,第二步將配置Log4j環境,其語法爲:

BasicConfigurator.configure (): 自動快速地使用缺省Log4j環境。
PropertyConfigurator.configure ( String configFilename) :讀取使用Java的特性文件編寫的配置文件。 
DOMConfigurator.configure ( String filename ) :讀取XML形式的配置文件。
 
log4j配置文件位置詳解

自動加載配置文件:

(1)若是採用log4j輸出日誌,要對log4j加載配置文件的過程有所瞭解。log4j啓動時,默認會尋找source folder下的log4j.xml配置文件,若沒有,會尋找log4j.properties文件。而後加載配置。配置文件放置位置正確,不用在程序中手動加載log4j配置文件。若是將配置文件放到了config文件夾下,在build Path中設置下就行了。

若要手動加載配置文件以下:

(1)PropertyConfigurator.configure("log4j.properties") 默認讀取的是項目根目錄的路徑。此時的log4j.properties要放在項目目錄下。

如圖,log4j.properties和src是同級目錄,同在根目錄下

(2)通常,一個java項目會有不少的配置文件,建議把全部的配置文件放到一個文件夾下,

例如,放到config文件夾。那麼在讀取這些配置文件的時候要加上子目錄名稱。

如圖在項目目錄下建立config文件夾(注意:不是在src文件下),此時,config和src是同級目錄

這時,讀取路徑改成:

PropertyConfigurator.configure("config/log4j.properties");

(3):若是不手動設置,不用人爲的寫加載log.properties文件的代碼時,直接放src目錄下,千萬要記得,若是新建一個JAVA項目,src文件要弄成原文件包才行

我就是用的這個

(4)項目打成jar包時,通常不會把配置文件也打進jar包。

若是是第一種方式,直接將log4j.properties文件和生成的HelloWorld.jar放在同一目錄下,項目就能順利讀取配置文件。

若是是第二種方式,要創建config文件夾,把配置文件放入其中,再將config文件和生成的HelloWorld.jar放在同一目錄下,項目就能順利讀取配置文件。

 思考:log4j.properties配置文件,配置簡單,但不支持複雜過濾器filter,log4j.xml雖然配置文件看似複雜,但支持複雜過濾器和Log4j的新特性。推薦使用log4j.xml

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

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

 
   
Logger.debug ( Object message ) ; 
Logger.info ( Object message ) ; 
Logger.warn ( Object message ) ; 
Logger.error ( Object message ) ;
 
     

5. 繼承關係

Log4J提供了一個root Logger,它是全部Logger組件的「祖先」,它永遠存在,且不能經過名字檢索或引用,經過Logger.getRootLogger()方法取得它。

可在配置文件中方便地配置存在繼承關係的Logger組件,凡是在符號「.」後面的組件都會成爲在符號「.」前面的Logger組件的子類。例如:-

   log4j.apache.myLogger=WARN-

   log4j.apache.myLogger.mySonLogger=,file-

以上代碼中, mySonLogger是myLogger的子類Logger組件。 

6. 以包爲單位指定日誌等級

log4j.logger.com.neareast =DEBUG

log4j.logger.org.apache.struts=WARN

指定com.neareast包下的全部類的等級爲DEBUG。

指定struts 包下的全部類的等級爲WARN。 

7. 基本使用方法

public staticLogger Logger.getLogger(Class clazz)至關於調用Logger.getLogger(clazz.getName()),該方法被認爲是目前所知的最理智的命名logger的方法。

    static Logger logger = Logger.getLogger(BaseParpare.class.getName());
 
其餘用方法:

一、使用org.apache.commons.logging.Log類:

例如private final Log log = LogFactory.getLog(getClass()); 

二、直接使用log4j的Logger類:

得到rootLogger:Logger rootLogger=Logger.getRootLogger();-

得到自定義Logger:Logger myLogger =Logger.getLogger("log4j.logger.myLogger"); 

Logger由一個String類的名字識別,根logger(root logger)是全部logger的祖先,它具備以下屬性:1)它老是存在的;2)它不能夠經過名字得到。 

兩種方法的區別:

LogFactory來自common-logging包。若是用LogFactory.getLog:

優勢:你能夠用任何實現了通用日誌接口的日誌記錄器替換log4j,而程序不受影響。

缺點:須要多一個common-logging包,這勉強算一個缺點。

Logger來自log4j本身的包。若是用Logger.getLogger:

優勢:你只須要一個log4j的jar包。

缺點:你只能用log4j做爲日誌記錄器,由於log4j已經硬編碼進你的系統了。

apache的common-logging包是通用日誌接口,經過這個中間層,你能夠經過其配置文件commons-logging.properties,來指定到底用哪一個日誌系統,以此增長系統的靈活性。

另:

爲儘量的提升系統性能,減少沒必要要的性能損耗,使用相似下面的判斷能夠在某級別的日誌被關閉時,避免隱性的性能損耗(即便不須要輸出日誌,大量debug等語句的參數處理也須要消耗可觀的計算量):

  1. if(logger.isDebugEnabled() {  
  2.     logger.debug("Entry number: " + i + " is " +String.valueOf(entry[i]));  
  3. }  

要將異常信息寫入日誌,使用e.getMessage()方法並不能獲得正確的異常棧。要輸出完整的異常棧,能夠定義一個getTrace方法,而後使用logger.debug(getTrace(e))來記錄日誌;getTrace方法定義以下:

  1. public String getTrace(Throwable t) {  
  2.     StringWriter stringWriter= new StringWriter();  
  3.     PrintWriter writer= new PrintWriter(stringWriter);  
  4.     t.printStackTrace(writer);  
  5.     StringBuffer buffer= stringWriter.getBuffer();  
  6. return buffer.toString();  
  7. }  

8.       配置文件示例

  1. log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE,ROLLING_FILE  
  2. #log4j.logger.cn.com.cnpc.backGroundServer.component.messageComponent=DEBUG,CONSOLE,FILE,ROLLING_FILE  
  3. #children-logger是否使用 rootLogger的配置  
  4. log4j.additivity.org.apache=false  
  5. # 應用於控制檯  
  6. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender  
  7. log4j.appender.CONSOLE.Target=System.out  
  8. log4j.appender.CONSOLE.encoding=utf-8  
  9. log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout  
  10. log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p]%l - %m%n  
  11. #應用於文件  
  12. log4j.appender.FILE=org.apache.log4j.FileAppender  
  13. log4j.appender.FILE.File=E:/work/logs/OfflineMap.log  
  14. log4j.appender.FILE.Append=false  
  15. log4j.appender.FILE.encoding=utf-8  
  16. log4j.appender.FILE.layout=org.apache.log4j.PatternLayout  
  17. log4j.appender.FILE.layout.ConversionPattern=%d-%-4r [%t]%-5p%l %x- %m%n  
  18. # 應用於文件回滾  
  19. log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender  
  20. log4j.appender.ROLLING_FILE.File=E:/work/logs/OfflineMap.r.log  
  21. log4j.appender.ROLLING_FILE.Threshold=INFO  
  22. log4j.appender.ROLLING_FILE.Append=true  
  23. log4j.appender.ROLLING_FILE.Encoding=utf-8  
  24. log4j.appender.ROLLING_FILE.MaxFileSize=10240KB  
  25. log4j.appender.ROLLING_FILE.MaxBackupIndex=10  
  26. log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout  
  27. log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r[%t] %-5p %c %x - %m%n  
  28. # 天天新建日誌  
  29. log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender  
  30. log4j.appender.A1.File=C:/log4j/log  
  31. log4j.appender.A1.Encoding=GBK  
  32. log4j.appender.A1.Threshold=DEBUG  
  33. log4j.appender.A1.DatePattern='.'yyyy-MM-dd  
  34. log4j.appender.A1.layout=org.apache.log4j.PatternLayout  
  35. log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n  
  36. # 用於數據庫  
  37. log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender  
  38. log4j.appender.DATABASE.URL=jdbc:oracle:thin:@90.0.12.20:1521:ORCL  
  39. log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver  
  40. log4j.appender.DATABASE.user=Nation  
  41. log4j.appender.DATABASE.password=1  
  42. log4j.appender.CONSOLE.Threshold=WARN  
  43. log4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread,infolevel,class,messages) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l','%m')  
  44. # INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c%x - %m%n')  
  45. # 寫入數據庫中的表LOG4J的Message字段中,內容%d(日期)%c:日誌信息所在地(類名)%p:日誌信息級別%m: 產生的日誌具體信息 %n: 輸出日誌信息換行  
  46. log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout  
  47. log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t]%-5p %c %x - %m%n  
  48. #自定義Appender  
  49. log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender  
  50. log4j.appender.im.host = mail.cybercorlin.net  
  51. log4j.appender.im.username = username  
  52. log4j.appender.im.password = password  
  53. log4j.appender.im.recipient = corlin@cybercorlin.net  
  54. log4j.appender.im.layout=org.apache.log4j.PatternLayout  
  55. log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p%c %x - %m%n  
  56. #應用於socket  
  57. log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender  
  58. log4j.appender.SOCKET.RemoteHost=localhost  
  59. log4j.appender.SOCKET.Port=5001  
  60. log4j.appender.SOCKET.LocationInfo=true  
  61. log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout  
  62. log4j.appender.SOCKET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n  
  63. #LogFactor 5 Appender  
  64. log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender  
  65. log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000  
  66. log4j.appender.LF5_APPENDER.layout=org.apache.log4j.PatternLayout  
  67. log4j.appender.LF5_APPENDER.layout.ConversionPattern =[framework] %d - %c -%-4r[%t] %-5p %c %x - %m%n  
  68. #發送日誌給郵件  
  69. log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender  
  70. log4j.appender.MAIL.Threshold=FATAL  
  71. log4j.appender.MAIL.BufferSize=10  
  72. log4j.appender.MAIL.From=web@www.wuset.com  
  73. log4j.appender.MAIL.SMTPHost=www.wusetu.com  
  74. log4j.appender.MAIL.Subject=Log4J Message  
  75. log4j.appender.MAIL.To=web@www.wusetu.com  
  76. log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout  
  77. log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t]%-5p %c %x - %m%n  M,/:"pIO78651`
相關文章
相關標籤/搜索