記錄 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"); } }