Log4J基礎詳解及示例大全

JavaAlpha發表於2013-07-20

去年這個時候,為做軟體工程的大作業就詳細學過Log4J的用法了,時隔一年想要在新的專案中好好使用一下的時候,發現幾乎全忘了,悲催啊……

再上網查資料,總是不能找到一篇符合我的口味,拿來就能輕鬆上手,方便查閱的文章。看了幾篇網文以及Apache的官方文件,耐心的總結了一下,貼出來分享,也方便自己以後查閱!

著急的話,可以直接從第8部分配置檔案示例中擷取一段配置檔案拿去用就好啦~(可能還需要看一眼第7部分回顧一下基本使用方法。)

 

log4j主要由三大元件組成:loggers,appenders和layouts。

Log4J基礎詳解及示例大全

1.      定義日誌元件logger

每個logger都可以擁有一個或者多個appender,每個appender表示一個日誌的輸出目的地,比如console或者某個檔案。

配置root Logger的語法為:

log4j.rootLogger=[priority],appenderName,appenderName,...­

配置自定義Logger元件的語法為:

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

 

log4j.rootLogger=INFO,stdout , R

此句為將等級為INFO的日誌資訊輸出到stdoutR這兩個目的地,stdoutR的定義在下面的程式碼,可以任意起名。

日誌等級可分為OFFFATALERRORWARNINFODEBUGALL,如果配置OFF則不打出任何資訊。

預設情況下,loggeradditive標誌被設定為true,表示未被分配levellogger將繼承離他最近的父logger的所有appenders。該選項可以被重新設定,表示子logger將不再繼承父loggerappenders

 

log4j.logger.myLogger=WARN­

自定義了一個Logger元件,名稱為myLogger,日誌級別為WARN

 

2.      配置輸出目的地appender

appender的任務是把layout格式化好的輸出內容送往指定的目的地。每個appender都和一個layout相聯絡;layout的任務是格式化使用者的logging request。

 

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(將日誌資訊以流格式傳送到任意指定的地方)

各種型別的Appender有特定的配置選項;具體可參照本文最後的示例,或檢視官方文件。

3.      指定layout型別

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

4.      具體格式

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

 

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.       基本使用方法

通常會見到兩種使用方法:

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

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

2、直接使用log4j的Logger類:

獲得rootLogger:Logger rootLogger=Logger.getRootLogger();­

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

 

Logger由一個String類的名字識別,根logger(root logger)是所有logger的祖先,它具有如下屬性:1)它總是存在的;2)它不可以通過名字獲得。

public staticLogger Logger.getLogger(Class clazz)相當於呼叫Logger.getLogger(clazz.getName()),該方法被認為是目前所知的最理智的命名logger的方法。

 

兩種方法的區別:

LogFactory來自common-logging包。如果用LogFactory.getLog:

優點:你可以用任何實現了通用日誌介面的日誌記錄器替換log4j,而程式不受影響。

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

 

Logger來自log4j自己的包。如果用Logger.getLogger:

優點:你只需要一個log4j的jar包。

缺點:你只能用log4j作為日誌記錄器,因為log4j已經硬編碼進你的系統了。

apache的common-logging包是通用日誌介面,通過這個中間層,你可以通過其配置檔案commons-logging.properties,來指定到底用哪個日誌系統,以此增加系統的靈活性。

另:

         為儘可能的提高系統效能,減小不必要的效能損耗,使用類似下面的判斷可以在某級別的日誌被關閉時,避免隱性的效能損耗(即使不需要輸出日誌,大量debug等語句的引數處理也需要消耗可觀的計算量):

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

8.       配置檔案示例

log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE,ROLLING_FILE
log4j.addivity.org.apache=true

# 應用於控制檯
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=GBK
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t]%-5p %c %x - %m%n

# 用於資料庫
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:oracle:thin:@90.0.12.20:1521:ORCL
log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user=Nation
log4j.appender.DATABASE.password=1
log4j.appender.CONSOLE.Threshold=WARN
log4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread,infolevel,class,messages) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l','%m')
# INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c%x - %m%n')
# 寫入資料庫中的表LOG4J的Message欄位中,內容%d(日期)%c:日誌資訊所在地(類名)%p:日誌資訊級別%m: 產生的日誌具體資訊 %n: 輸出日誌資訊換行
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t]%-5p %c %x - %m%n

#應用於檔案
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=C:/log4j/file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.Encoding=GBK
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p%c %x - %m%n

# 應用於檔案回滾
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.Encoding=GBK
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r[%t] %-5p %c %x - %m%n

# 每天新建日誌
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=C:/log4j/log
log4j.appender.A1.Encoding=GBK
log4j.appender.A1.Threshold=DEBUG
log4j.appender.A1.DatePattern='.'yyyy-MM-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n

#自定義Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p%c %x - %m%n

#應用於socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
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

# LogFactor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
log4j.appender.LF5_APPENDER.layout=org.apache.log4j.PatternLayout
log4j.appender.LF5_APPENDER.layout.ConversionPattern =[framework] %d - %c -%-4r[%t] %-5p %c %x - %m%n

# 傳送日誌給郵件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t]%-5p %c %x - %m%n

轉載自:http://blog.csdn.net/neareast/article/details/7584385


相關文章