如果我們在項目中,需要記錄的東西並不多,而且也不需要有太多區分,使用jdk的自帶Log完全可以解決問題。但是,在開發的過程中,大多數項目都比較大,為方便找到程序的bug,都是需要系統的記錄日志的。這里邊出現了Log4j(Log for Java),Apache Log4j下載地址:log4j官方下載。
apache的log4j是一個開源項目,作為一個強大的日志組件,它提供的功能遠比jdk系統再帶的log要多,可以通過配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。
下面是本人測試log4j的過程
1、新建java項目:Logger
2、添加log4j-1.2.17.jar包
3、添加log4j.properties配置文件,這里在寫的過程中發現,在寫入properties文件的時候,會將中文字符轉化為unicode碼,所以我將log4j.properties更改為log4j.txt文件,然后在代碼中手動加載log4j.txt文件(文件位置config/log4j.txt)
config/log4j.txt:
### 設置logger級別 ### log4j.rootLogger = debug,stdout,D,E ### 輸出格式解釋: ### [%-d{yyyy-MM-dd HH:mm:ss}][Class: %c.%M(%F:%L)] %n[Level: %-5p] - Msg: %m%n ### %d{yyyy-MM-dd HH:mm:ss}: 時間,大括號內是時間格式 ### %c: 全類名 ### %M: 調用的方法名稱 ### %F:%L 類名:行號(在控制台可以追蹤代碼) ### %n: 換行 ### %p: 日志級別,這里%-5p是指定的5個字符的日志名稱,為的是格式整齊 ### %m: 日志信息 ### 輸出的信息大概如下: ### [時間{時間格式}][信息所在的class.method(className:lineNumber)] 換行 ### [Level: 5個字符的等級名稱] - Msg: 輸出信息 換行 ### appender.stdout輸出到控制台 ### 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{yyyy-MM-dd HH:mm:ss}][Class: %c.%M(%F:%L)] %n[Level: %-5p] - Msg: %m%n ### appender.D輸出Debug信息到日志文件 E://logs/error.log ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = E://Log//Log4j//log4j_debug.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = [%-d{yyyy-MM-dd HH:mm:ss}][Class: %c.%M(%F:%L)] %n[Level: %-5p] - Msg: %m%n ### appender.D輸出Error信息到日志文件 E://logs/error.log ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = E://Log//Log4j//log4j_error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = [%-d{yyyy-MM-dd HH:mm:ss}][Class: %c.%M(%F:%L)] %n[Level: %-5p] - Msg: %m%n
4、寫測試類Log4jTest.java
package cn.darkranger.log.log4j; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.junit.Test; public class Log4jTest { private static Logger logger = Logger.getLogger(Log4jTest.class); static { // **** 在JavaWeb中一般通過下面方式配置 **** // <context-param> // <param-name>log4jConfigLocation</param-name> // <param-value>/WEB-INF/classes/log4j.properties</param-value> // </context-param> // <listener> // <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> // </listener> // **** 在Java項目中 **** // 手動讀取配置文件 // 讀取的文件應該是log4j.properties,由於在log4j.properties中中文會轉化為Unicode碼,將文件修改為log4j.txt PropertyConfigurator.configure("config/log4j.txt"); } @Test public void test01() { // 等級從上到下依次下降 // 災難、嚴重 logger.fatal("this is fatal!"); // 錯誤 logger.error("this is error!"); // 警告 logger.warn("this is warn!"); // 信息 logger.info("this is info!"); // 調試 logger.debug("this is debug!"); // 追蹤 logger.trace("this is trace!"); } }
測試:
控制台輸出:
[2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:32)] [Level: FATAL] - Msg: this is fatal! [2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:34)] [Level: ERROR] - Msg: this is error! [2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:36)] [Level: WARN ] - Msg: this is warn! [2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:38)] [Level: INFO ] - Msg: this is info! [2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:40)] [Level: DEBUG] - Msg: this is debug!
文件輸出:
E:\Log\Log4j\log4j_debug.log
[2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:32)] [Level: FATAL] - Msg: this is fatal! [2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:34)] [Level: ERROR] - Msg: this is error! [2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:36)] [Level: WARN ] - Msg: this is warn! [2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:38)] [Level: INFO ] - Msg: this is info! [2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:40)] [Level: DEBUG] - Msg: this is debug!
E:\Log\Log4j\log4j_error.log
[2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:32)] [Level: FATAL] - Msg: this is fatal! [2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:34)] [Level: ERROR] - Msg: this is error!