fbpx

JAVA Apache Log4j API 實作與教學 (Mail,File,SQL)

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
[email protected]
[email protected]

#設定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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料