記錄 Log4J 的使用!!
Log4J不僅能在主控台輸出訊息,還能寫到檔案或資料庫中,相當好用的訊息工具
1.先下載 log4j-1.2.17.jar 並加到專案中
2.建立 log4j 的設定檔,副檔名為 Log4J.properties ,並放到 project_root_dir/logfile/log4j/ 中。
如下

log4j.rootLogger=DEBUG,consoleAppender,fileAppender
#,mailAppender,dbAppender
#Console Log(主控台輸出)
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %m %l %F %n
#File Log(檔案輸出)
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=d:/temp/log4j.log
log4j.appender.fileAppender.MaxFileSize=30MB
log4j.appender.fileAppender.MaxBackupIndex=10000
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %m%n
#Mail Log(使用時必須import javamail相關的jar  功能:一出錯馬上發送mail)
#log4j.appender.mailAppender=org.apache.log4j.net.SMTPAppender
#log4j.appender.MailLog.Threshold=error
#log4j.appender.mailAppender.BufferSize=512
#log4j.appender.mailAppender.From=xxx@xxx.com
#log4j.appender.mailAppender.To=xxx@xxx.com
#log4j.appender.mailAppender.SMTPHost=xxx.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(使用時必須import jdbc driver相關的jar  功能:寫 log 到 db 中)
#log4j.appender.dbAppender=org.apache.log4j.jdbc.JDBCAppender
#log4j.appender.dbAppender.driver=oracle.jdbc.driver.OracleDriver
#log4j.appender.dbAppender.URL=jdbc:oracle:thin:@xxx:1521:xxx
#log4j.appender.dbAppender.user=xxx
#log4j.appender.dbAppender.password=xxx
#log4j.appender.dbAppender.layout=org.apache.log4j.PatternLayout
#log4j.appender.dbAppender.sql=INSERT INTO LOG(STATUS,MESSAGE,LOGDT) VALUES ('%-5p','%m',SYSDATE)
#等級
#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 輸出日誌訊息所屬的類別的類別名。
#appender被設為org.apache.log4j.DailyRollingFileAppender表示Log4j會將LOG檔依日期分開。

最後直接在程式碼中使用,寫了一個簡單的類別(Facade)方便印出訊息
Log4JFacade.java

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Log4JFacade {
    static Properties pro;
    static Logger logger;
    static{
        loadPropertiesForLog4J();
        setConfigForLogger();
    }
    private static void loadPropertiesForLog4J(){
        pro = new Properties();
        try {
            pro.load(new FileReader("logfile/log4j/Log4J.properties"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void setConfigForLogger(){
        PropertyConfigurator.configure(pro);
        logger = Logger.getLogger("J2SE");
    }
    public static void printDebug(String mes){
        logger.debug(mes);
    }
    public static void printInfo(String mes){
        logger.info(mes);
    }
    public static void printWarning(String mes){
        logger.warn(mes);
    }
    public static void printError(String mes){
        logger.error(mes);
    }
    public static void printFatal(String mes){
        logger.fatal(mes);
    }
}

使用範例

public class Log4J_Exam {
    public static void main(String[] args){
        Log4JFacade.printDebug("your message");
        Log4JFacade.printInfo("your message");
        Log4JFacade.printWarning("your message");
        Log4JFacade.printError("your message");
        Log4JFacade.printFatal("your message");
    }
}