日志是應用軟件中不可缺少的部分,Apache的開源項目Log4j是一個功能強大的日志組件,提供方便的日志記錄,具體請參考Log4j文檔指南。
Log4j下載
在apache網站,可以免費下載到Log4j最新版本的軟件包
Apache log4j (推薦)
Log4j的包下載完成后,解壓,將其中打包好的的log4j-1.x.x.jar導入你的工程LIB中。
Log4j配置
Log4J的配置文件(Configuration File)就是用來設置記錄器的級別、存放器和布局的,它可接key=value格式的設置或xml格式的設置信息。通過配置,可以創建出Log4J的運行環境。
1. 配置文件
Log4J配置文件的基本格式如下:














其中 [level] 是日志輸出級別,共有5級:






Appender 為日志輸出目的地,Log4j提供的appender有以下幾種:





Layout:日志輸出格式,Log4j提供的layout有以下幾種:




打印參數: Log4J采用類似C語言中的printf函數的打印格式格式化日志信息,如下:









2. 在代碼中初始化Logger:
1)在程序中調用BasicConfigurator.configure()方法:給根記錄器增加一個ConsoleAppender,輸出格式通過PatternLayout設為"%-4r [%t] %-5p %c %x - %m%n",還有根記錄器的默認級別是Level.DEBUG.
2)配置放在文件里,通過命令行參數傳遞文件名字,通過PropertyConfigurator.configure(args[x])解析並配置;
3)配置放在文件里,通過環境變量傳遞文件名等信息,利用log4j默認的初始化過程解析並配置;
4)配置放在文件里,通過應用服務器配置傳遞文件名等信息,利用一個特殊的servlet來完成配置。
Log4j示例
新建Java工程,代碼
- package com.homer;
- import org.apache.log4j.BasicConfigurator;
- import org.apache.log4j.Logger;
- import org.apache.log4j.PropertyConfigurator;
- import org.apache.log4j.xml.DOMConfigurator;
- public class HMain {
- static Logger log4j = Logger.getLogger(HMain.class.getClass());
- public HMain(){
- System.out.println("hello, I am HMain");
- printLog();
- }
- private void printLog(){
- BasicConfigurator.configure();
- PropertyConfigurator.configure("/home/homer/workspace/myLog4j/WebContent/WEB-INF/log4j.properties");
- DOMConfigurator.configure("");
- log4j.debug("log4j debug");
- log4j.info("log4j info");
- log4j.warn("log4j warn");
- log4j.error("log4j error");
- log4j.fatal("log4j fatal");
- }
- }
Log4j 配置文件(log4j.properties)
- ### set log levels ###
- log4j.rootLogger = debug , stdout , D , E
- ### 輸出到控制台 ###
- log4j.appender.stdout = org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.Target = System.out
- log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n
- ### 輸出到日志文件 ###
- log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File = logs/log.log
- log4j.appender.D.Append = true
- log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級別以上的日志
- log4j.appender.D.layout = org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
- ### 保存異常信息到單獨文件 ###
- log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.E.File = /logs/error.log ## 異常日志文件名
- log4j.appender.E.Append = true
- log4j.appender.E.Threshold = ERROR ## 只輸出ERROR級別以上的日志!!!
- log4j.appender.E.layout = org.apache.log4j.PatternLayout
- log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %l:%c:%t:%r ] - [ %p ] %m%n
運行結果(/home/homer/logs目錄下):
控制台(console)
15:56:12,718 DEBUG java.lang.Class:24 - log4j debug
15:56:12,722 INFO java.lang.Class:25 - log4j info
15:56:12,723 WARN java.lang.Class:26 - log4j warn
15:56:12,723 ERROR java.lang.Class:27 - log4j error
15:56:12,723 FATAL java.lang.Class:28 - log4j fatal
error.log
2012-09-20 15:56:12 [ com.homer.HMain.printLog(HMain.java:24):java.lang.Class:http-bio-9980-exec-3:0 ] - [ DEBUG ] log4j debug
2012-09-20 15:56:12 [ com.homer.HMain.printLog(HMain.java:25):java.lang.Class:http-bio-9980-exec-3:4 ] - [ INFO ] log4j info
2012-09-20 15:56:12 [ com.homer.HMain.printLog(HMain.java:26):java.lang.Class:http-bio-9980-exec-3:5 ] - [ WARN ] log4j warn
2012-09-20 15:56:12 [ com.homer.HMain.printLog(HMain.java:27):java.lang.Class:http-bio-9980-exec-3:5 ] - [ ERROR ] log4j error
2012-09-20 15:56:12 [ com.homer.HMain.printLog(HMain.java:28):java.lang.Class:http-bio-9980-exec-3:5 ] - [ FATAL ] log4j fatal
log.log
2012-09-20 15:56:12 [ http-bio-9980-exec-3:0 ] - [ DEBUG ] log4j debug
2012-09-20 15:56:12 [ http-bio-9980-exec-3:4 ] - [ INFO ] log4j info
2012-09-20 15:56:12 [ http-bio-9980-exec-3:5 ] - [ WARN ] log4j warn
2012-09-20 15:56:12 [ http-bio-9980-exec-3:5 ] - [ ERROR ] log4j error
2012-09-20 15:56:12 [ http-bio-9980-exec-3:5 ] - [ FATAL ] log4j fatal
參考推薦: