2013年10月31日 星期四

[Log4j] 簡易Log4j 設定

好用的 訊息紀錄工具 Log4j
簡易測試程式

package com.test;
import org.apache.log4j.Logger;

public class Log4jTest {
    public static void main(String[] args){
        Logger logger = Logger.getLogger("Log4jTest.class");
        logger.debug("Hello World!!!");
        logger.info("What a beautiful day!!");
    }
}

需要在 src 的目錄下生成一 Log4j.properties 說明
log4j.rootLogger=DEBUG, console, logfile

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %-5p %l - %m%n
log4j.appender.console.encoding=UTF-8

log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{MM-dd HH:mm:ss} %-5p %l - %m%n
log4j.appender.logfile.File=c:/log.txt
log4j.appender.logfile.MaxFileSize=3MB
log4j.appender.logfile.MaxBackupIndex=5
log4j.appender.logfile.encoding=UTF-8

log4j.logger.org.apache.commons=INFO
log4j.logger.org.apache.jasper=INFO
log4j.logger.org.apache.catalina=INFO

PatternLayout(ConversionPattern) 的 格式字元列表如下:
# %c 輸出日誌訊息所屬的類別的全名
# %d 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyy-MM-dd HH:mm:ss }。
# %l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。
# %m 輸出訊息,如log(message)中的message。
# %n 輸出一個列尾符號。
# %p 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。
# %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
# %t 輸出產生該日誌事件的線程名。
# %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
# %f 輸出日誌訊息所屬的類別的類別名。
# %M 輸出日誌訊息所屬的類別的方法名。

若執行時發生以下錯誤訊息,則表示 Log4j.properties未設定 or 找不到
log4j:WARN No appenders could be found for logger (Log4jTest.class).
log4j:WARN Please initialize the log4j system properly.

若是採用 log4j.xml 的設定方式(web端搭配web.xml)在程式初始化過程中發生錯誤

Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener

例如設定了:
 請加上下面這一段
問題解答參考:http://emsooriyabandara.blogspot.tw/2013/05/exception-sending-context-initialized.html

參考資料:
log4j訊息:WARN No appenders could be found for logger
[java] Log4j簡介與快速設定
[Java] log4j 的說明及實作
log4j.properties详解与例子
Log4j簡介

其他補充
一、Log4j簡介
Log4j有三個主要的元件:Loggers、Appenders、Layouts。

1、Loggers(寫Log )
被分為五個級別:DEBUG < INFO < WARN < ERROR < FATAL
只輸出級別不低於設定級別的訊息
ex:Loggers為INFO,則INFO、WARN、ERROR和FATAL都會輸出 DEBUG則不會

logger名稱階層關係
ex:名稱為"com.foo"的 logger 是名稱為"com.foo.Bar"的 logger的parent
程式中具名取得logger的方法是
Logger.getLogger(String name)  //名稱相同取得的logger一定一樣,不同則產生新的
通常我們用  Logger.getLogger(myApp.class) 取得loggger,名稱為程式的class  name,因此層級關係跟package層級關係吻合...

有一個最上層的root logger,root logger 一定存在的,且只能以 Logger.getRootLogger()方式取得它的參考.不能以具名方式取得.

2、Appenders(log訊息的終點(目的地))

常使用的類如下:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)
org.apache.log4j.RollingFileAppender(文件大小到達指定size的時候產生一個新的文件)
org.apache.log4j.WriterAppender(將日誌訊息以輸出流格式發送到任意指定的地方)

如 System.out.println("Some message..."), 對Log4j 而言appenders 就是 console


配置模式:
log4j.appender.appenderName = className
log4j.appender.appenderName.Option1 = value1

log4j.appender.appenderName.OptionN = valueN

3、Layouts( Log訊息的格式 )

常使用的類如下:

org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
org.apache.log4j.SimpleLayout(包含日誌訊息的級別和訊息字符串)
org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等訊息)

配置模式:

log4j.appender.appenderName.layout =className
log4j.appender.appenderName.layout.Option1 = value1

log4j.appender.appenderName.layout.OptionN = valueN


二、簡單範例

log4j.rootLogger=Info, A1, A2


# A1 is set to be a ConsoleAppender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss}][%p][%C-%L] %m%n

# A2 is set to be a file
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss}][%p][%C-%L] %m%n
log4j.appender.A2.File=./log/gpserver-${log4j.date}.log


三、配置詳解

配置文件事實上也就是對Logger、Appender及Layout進行相應設定。
Log4j支援兩種配置文件格式,一種是XML格式的文件,一種是properties屬性文件。

下面以properties屬性文件為例介紹log4j.properties的配置。

1、配置根Logger:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
log4j.additivity.org.apache=false:表示Logger不會在父Logger的appender裡輸出,默認為true。

level :設定日誌記錄的最低級別,可設的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別,
ex:Loggers為INFO,則INFO、WARN、ERROR和FATAL都會輸出 DEBUG則不會

appenderName:指定log訊息要輸出到哪裡。可以同時指定多個輸出目的地,用逗號隔開。
例如:log4j.rootLogger=INFO,A1,B2,C3

2、配置appender:
log4j.appender.appenderName = className
appenderName:自定義appderName,在log4j.rootLogger設置中使用;
className:可設值如下:
   (1)org.apache.log4j.ConsoleAppender(控制台)
   (2)org.apache.log4j.FileAppender(文件)
   (3)org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)
   (4)org.apache.log4j.RollingFileAppender(文件大小到達指定大小的時候產生一個新的文件)
   (5)org.apache.log4j.WriterAppender(將日誌訊息以輸出流格式發送到任意指定的地方)


Appender 的設定亦會反映在 Logger 的階層中。
當 Logger 輸出一筆 log message 時,父階層的 Appender 和自己的 Appender(如果有的話)都會記錄到這筆 log message;

例如"com.foo" Logger 有一個 Appender 將 log message 輸出到 console,
而 "com.foo.bar" 有一個 Appender 將 log message 輸出到檔案;
當 "com.foo.bar" Logger 輸出一筆 log message 時, console 和檔案都會出現這筆 log message。

而最簡單的例子,就是當 root logger 擁有一個輸出到 console 的 Appender 時,
則程式中所有的 logger 所產生的 log message 都會輸出到 console。
唯一個例外的情況,是當某個 logger 將自己的 additivity 屬性設為 false(Logger.setAdditivity(false)),
則此 logger 與隸屬於它的子 logger 都不會將 log message 寫到 console。


(1)ConsoleAppender選項:
Threshold=WARN:指定日誌訊息的最低輸出級別,預設為DEBUG。
ImmediateFlush=true:表示所有訊息都會被立即輸出,設為false則不輸出,預設值是true。
Target=System.err:預設值是System.out。

(2)FileAppender選項:
Threshold=WARN:指定日誌訊息的最低輸出級別,默認為DEBUG。
ImmediateFlush=true:表示所有訊息都會被立即輸出,設為false則不輸出,預設值是true。
Append=false:true表示訊息增加到指定文件中,false則將消息覆蓋指定的文件內容,預設值是true。
File=D:/logs/logging.log4j:指定訊息輸出到logging.log4j文件中。

(3)DailyRollingFileAppender選項:
Threshold=WARN:指定日誌訊息的最低輸出級別,預設為DEBUG。
ImmediateFlush=true:表示所有訊息都會被立即輸出,設為false則不輸出,預設值是true。
Append=false:true表示訊息增加到指定文件中,false則將消息覆蓋指定的文件內容,預設值是true。
File=D:/logs/logging.log4j:指定訊息輸出到logging.log4j文件中。
DatePattern='.'yyyy-MM:即每月產生一個新的日誌文件。
若目前月的日誌文件名為logging.log4j,前一個月的日誌文件名會為為logging.log4j.yyyy-MM
另外,也可以指定按周、天、時、分等來滾動日誌文件,對應的格式如下:
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:每分鐘

若要有副檔名:
'_'yyyy-MM-dd'.log'


(4)RollingFileAppender選項:
Threshold=WARN:指定日誌訊息的最低輸出級別,預設為DEBUG。
ImmediateFlush=true:表示所有訊息都會被立即輸出,設為false則不輸出,預設值是true。
Append=false:true表示訊息增加到指定文件中,false則將消息覆蓋指定的文件內容,預設值是true。
File=D:/logs/logging.log4j:指定訊息輸出到logging.log4j文件中。
MaxFileSize=100KB:單位可以是KB, MB 或者GB。在日誌文件到達該大小時,將會自動變更,即將原來的內容移到logging.log4j.1文件中。
MaxBackupIndex=2:指定可以產生的變動文件的最大數,例如,設為2則可以產生logging.log4j.1,logging.log4j.2兩個變動文件和一個logging.log4j文件。

3、配置日誌訊息的輸出格式(Layout):
log4j.appender.appenderName.layout=className
className:可設值如下:
(1)org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
(2)org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
(3)org.apache.log4j.SimpleLayout(包含日誌訊息的級別和訊息字符串)
(4)org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等訊息)

Layout 亦會反映在 Logger 的階層上。

(1)HTMLLayout選項:
LocationInfo=true:輸出java文件名稱和行號,預設值是false。
Title=My Logging: 預設值是Log4J Log Messages。

(2)PatternLayout選項:
ConversionPattern=%m%n:設定以怎樣的格式顯示訊息。

例如,為 Logger 加入一個 conversion pattern 為 "%r [%t] %-5p %c - %m%n" 的 PatternLayout,則輸出的 log message 就可能會像下列這樣:

176 [main] INFO org.foo.Bar - Located nearest gas station.


格式字元說明:
# %c 輸出日誌訊息所屬的類別的全名
# %d 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyy-MM-dd HH:mm:ss }。
# %l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。相當於%c.%M(%F:%L)的組合包括類別全名、method、檔案名以及行數例如:test.TestLog4j.main(TestLog4j.java:10)
# %m 輸出的訊息,如log(message)中的message。
# %n 輸出一個換行符號。
# %p 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。
# %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
# %t 輸出產生該日誌事件的執行緒名。
# %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
# %f 輸出日誌訊息所屬的類別的類別名。
# %M 輸出產生日誌的方法名。
# %F 輸出日誌時所在的檔案名稱。
# %L 輸出行號。
# %x 輸出和當前執行緒相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多執行緒的應用中。
# %% 輸出一個"%"字符。

另外,也可以在%與格式字符之間加上修飾符來控制其最小長度、最大長度、對齊方式。如:
1) c:指定輸出category的名稱,最小的長度是20,如果category的名稱長度小於20的話,預設的情況下右對齊。
2)%-20c:"-"號表示左對齊。
3)%.30c:指定輸出category的名稱,最大的長度是30,如果category的名稱長度大於30的話,就會將左邊多出的字符截掉,但小於30的話也不會補空格。

範例

Log4j配置文件實現了輸出到控制台(console)、logFile、rollingFile、發送日誌郵件、輸出到資料庫日誌表、自定義標籤等

log4j.rootLogger=DEBUG,console,dailyFile,im
log4j.additivity.org.apache=true

# 控制台(console)
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 日誌文件(logFile)
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=D:/logs/log.log4j
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# rollingFile
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 定期變更檔案(dailyFile)
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 應用於socket
log4j.appender.socket=org.apache.log4j.RollingFileAppender
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.Port=5001
log4j.appender.socket.LocationInfo=true
# Set up for Log Factor 5
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

# 發送日誌到指定郵件
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From = xxx@mail.com
log4j.appender.mail.SMTPHost=mail.com
log4j.appender.mail.Subject=Log4J Message
log4j.appender.mail.To= xxx@mail.com
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

# 應用於資料庫
log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=
log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %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=[%-5p] %d(%r) --> [%t] %l: %m %x %n

http://blog.sina.com.cn/s/blog_56fd58ab0100tcna.html
http://polinwei.blogspot.tw/2008/10/java-log4j.html
http://blog.xuite.net/chihho32/blog/9121126-%5BJAVA%5D+Log4J
http://www.ewdna.com/2009/11/javalog4j.html
http://www.91linux.com/html/article/program/java/20081226/15013.html

沒有留言 :

張貼留言