程式裡為了追蹤錯誤而寫一些log是很平常的事,最簡單的就是用System.out.println將log
寫到console或container指定的檔案,這個方法簡單,但是因提供的資訊不足,對於追蹤錯誤
通常不太夠,apache提供的Log4j是目前最流行的工具,因為它小巧卻又功能強大,底下將
簡單的介紹Log4j (這好像是我的風格?),如果要精通,可以參考官方網站的文件,官方網
站在
http://logging.apache.org/log4j/docs/index.html。
在看程式前,先將由官網上下載的Log4j API解開,找到一個名為 log4j-x.y.z.jar的檔案,將它加入
classpath。我寫的程式只有一個TestLog4j.java及一個Log4j.properties設定檔,如下圖:
- 測試程式
package tw.idv.idealist;
import java.io.IOException;
import java.util.*;
import org.apache.log4j.*;
public class TestLog4j {
static Logger logger;
static public void main(String args[]){
Properties logp = new Properties();
try {
logp.load(TestLog4j.class.getClassLoader()
.getResourceAsStream( "tw/idv/idealist/Log4j.properties"));
} catch (IOException e) {
e.printStackTrace();
}
PropertyConfigurator.configure(logp);
logger = Logger.getLogger("J2EE");
logger.debug("Hello Log4j");
logger.info("Hi Log4j");
}
}
- 設定檔
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:SSS}][%C-%M] %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{HH:mm:ss:SSS}][%C-%M] %m%n
log4j.appender.A2.File=C:/temp/connector_agent_trace.log
- 執行結果
在上面的設定檔設定成要輸出到console (A1)及檔案(A2),所以在console及C:/temp/connector_agent_trace.log都會有log輸出,
其結果如下:
Console:
[05/08/20 23:40:01:422][tw.idv.idealist.TestLog4j-main] Hi Log4j
log檔:
[23:40:01:422][tw.idv.idealist.TestLog4j-main] Hi Log4j
- 說明
- 階層
Log4j將輸出訊息分成五個等級,分別為DEBUG、INFO、WARN、ERROR、FATAL,在上面設定檔將輸出等級
設為INFO,就表示INFO~FATAL等級的訊息將會輸出,因此DEBUG等級的訊息就會被忽略,如果將設定檔的
第一行改為log4j.rootLogger=DEBUG, A1, A2,就會兩個訊息都輸出了。除了這五個等級外,也可以設為ALL或OFF,
ALL很示全部訊息都輸出,OFF則表示不輸出訊息。
- 輸出格式
# %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 輸出日誌訊息所屬的類別的類別名。
值得注意的是A2的appender被設為org.apache.log4j.DailyRollingFileAppender表示Log4j會將日誌檔依日期分開。
- See Also
log4net