Introduction
Log4j 是一套開放源碼的工具,方便程式設計人員在程式中加入 log 機制,並輸出到各種目標上。Log4j 能夠透過外部的設定檔(properites 或 XML)進行設定。Log4j 能夠將 log message 寫到 console, 檔案,串流,TCP 協定的伺服器, Unix Syslog daemon, Mail, Darabase 等。Log4j 具有 5 種 log 層級(DEBUG, INFO, WARN, ERROR, FATAL),可用於不同的系統狀態下所產生的訊息。本文針對log目標為檔案, Mail, Darabase等進行實作與測試。
Log4j運作方式
log4j主要的元件
- Logger - 在程式中使用,進行 logging 的元件,Logger 可以被指派等級。能夠指派給 Logger 的等級有 : DEBUG, INFO, WARN, ERROR, FATAL 5 種,定義在 org.apache.log4j.Level 類別中。這 5 種等級的高低順序為 FATAL > ERROR > WARN > INFO > DEBUG。
- Appender - 負責將 log message 輸出到各種裝置上,透過 Appender, Logger 能夠將 log message 輸出到指定的裝置上。一個 Logger 能夠擁有多個 Appender,所以 Logger 能夠同時將 log message 輸出到多個個裝置上。
- Layout - 決定 log message 的格式表示法,透過 Layout 的配置,能夠自由改變 Logger 寫出 log message 的格式。
Log4j 的階層架構
同一個程式中可以是用多個logger,logger彼此間包含階層式的關係。最頂端的logger稱為Root logger,例如有一個com.transtep.logger為root,那麼com.transtep.looger.ui就是root的隸屬logger。階層的最高的 Root logger 一定存在且不具有名稱屬性,可以隨時在程式中以 Logger.getRootLogger() 取得,其它 logger 則以 Logger.getLogger(String loggerName) 取得。位定義層級的子logger將會使用上層為logger層級。
Download
log4j官方網站 - http://logging.apache.org/
下載log4j,亦可以使用Eclipse內附的log4j。
下載所需的Lib
Postgresql JDBC Drive - http://jdbc.postgresql.org/
Java Mail API - http://java.sun.com/products/javamail/
log4j設定檔介紹
log4j提供兩種方式建立設定檔,Properties與XML在這裡採用較為直覺化的Properties進行測試。
新增一個檔案Log4j.properties
#定義 Root Logger 的等級 log4j.rootLogger=DEBUG,consoleAppender,fileAppender,dbAppender,mailAppender #Console Log log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout #定義log的格式 log4j.appender.consoleAppender.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %m%n #Mail Log log4j.appender.mailAppender=org.apache.log4j.net.SMTPAppender log4j.appender.MailLog.Threshold=error log4j.appender.mailAppender.BufferSize=512 log4j.appender.mailAppender.From=root@shell.idv.tw log4j.appender.mailAppender.To=root@shell.idv.tw #設定smtp host,但目前不支援認證的動作,需自行改寫log4j.appender.mailAppender.SMTPHost。 log4j.appender.mailAppender.SMTPHost=smtp.transtep.com log4j.appender.mailAppender.Subject=System Occur Error!!! log4j.appender.mailAppender.layout=org.apache.log4j.PatternLayout log4j.appender.mailAppender.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %m%n #Database Log 使用Postgresql進行資料庫的儲存 log4j.appender.dbAppender=org.apache.log4j.jdbc.JDBCAppender log4j.appender.dbAppender.driver=org.postgresql.Driver log4j.appender.dbAppender.URL=jdbc:postgresql://192.168.1.14:5432/SJ_LOG_DB?charSet=utf8 log4j.appender.dbAppender.user=postgres log4j.appender.dbAppender.password=admin log4j.appender.dbAppender.layout=org.apache.log4j.PatternLayout #sql命令 log4j.appender.dbAppender.sql=INSERT INTO logger(MESSAGE) VALUES ('%-5p - %m - SYSDATE') #File Log 檔案方式儲存 log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender #log檔案的位置 log4j.appender.fileAppender.File=d:/log.log #log檔大小 log4j.appender.fileAppender.MaxFileSize=1KB #保留多少log檔以利備份 log4j.appender.fileAppender.MaxBackupIndex=5 log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout log4j.appender.fileAppender.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %c %-5p %m%n
測試log4sj
新增TestLog4j.java
import java.io.FileInputStream; import java.util.*; import org.apache.log4j.*; public class TestLog4j { static Logger logger = Logger.getLogger(TestLog4j.class); static public void main(String args[]) { Properties logp = new Properties(); try { //讀取設定檔 FileInputStream istream = new FileInputStream("Log4j.properties"); logp.load(istream); istream.close(); } catch (Exception e) { e.printStackTrace(); } PropertyConfigurator.configure(logp); //記錄log logger.error("NO~~~~occur error......."); logger.debug("Hello Log4j"); logger.info("Hi Log4j"); } }
格式支援介紹
%c 輸出日誌訊息所屬的類別的全名
%d 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyy-MM-dd HH:mm:ss }。
%l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。
%m 輸出代碼中指定的訊息,如log(message)中的message。
%n 輸出一個列尾符號。
%p 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。-5p 代表將此字串填滿至 5 個字元,以空白補不足處。
%r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
%t 輸出產生該日誌事件的線程名。
%f 輸出日誌訊息所屬的類別的類別名。
Reference