類圖鎮樓
1.先談部署
別怕,這可不是部署Tomcat。把log4j的包和commons-logging的包(加在一起才兩個)放到classpath下面。然后把配置文件保存為log4j.properties,也放在classpath下面(如果用Eclipse的話,放在src目錄下即可)。然后你就可以跑了。
2.再談配置
雖然可以用xml或者在運行時用Java來配置Log4j,但還是properties文件好用啊!
樣例:
#日志級別DEBUG,目的地consoleAppender1,這是根日志組件,經測試,mybatis的SQL輸出收這個影響 log4j.rootLogger=DEBUG,consoleAppender1,debugfile #--------------配置 輸出對象的目的 格式 ----------------- #目的地consoleAppender1輸出到控制台 log4j.appender.consoleAppender1=org.apache.log4j.ConsoleAppender #目的地consoleAppender1輸出格式 log4j.appender.consoleAppender1.layout=org.apache.log4j.PatternLayout log4j.appender.consoleAppender1.layout.ConversionPattern=%5p %d %C: %m%n #debug 輸出錯誤日志文件 log4j.appender.errorfile=org.apache.log4j.RollingFileAppender log4j.appender.errorfile.File=${catalina.home}/logs/outside-error.log //${catalina.home} : tomcat服務器文件夾目錄 log4j.appender.errorfile.MaxFileSize=10240KB # Keep three backup files. log4j.appender.errorfile.MaxBackupIndex=3 # Pattern to output: date priority [category] - message log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout log4j.appender.errorfile.layout.ConversionPattern=%d %p - %m%n log4j.additivity.errorfile = false #debug 輸出其他日志文件 log4j.appender.debugfile=org.apache.log4j.RollingFileAppender log4j.appender.debugfile.File=${catalina.home}/logs/outside-debug.log log4j.appender.debugfile.MaxFileSize=10240KB # Keep three backup files. log4j.appender.debugfile.MaxBackupIndex=10 # Pattern to output: date priority [category] - message log4j.appender.debugfile.layout=org.apache.log4j.PatternLayout log4j.appender.debugfile.layout.ConversionPattern=%d %p - %m%n log4j.additivity.debugfile = false #--------------配置 具體內容輸出到 輸出對象------------------------------ #日志級別DEBUG,目的地consoleAppender2,和debugfile log4j.logger.service=DEBUG,debugfile #spring統一異常處理,日志級別ERROE,目的地consoleAppender2,和errorfile log4j.logger.util.web.CustomSimpleMappingExceptionResolver=info,errorfile #spring統一異常處理,日志級別ERROE,目的地consoleAppender2,和errorfile log4j.logger.util.web.ExceptionAdvisor=info,errorfile #mongodb,日志級別DEBUG,目的地consoleAppender1,和debugfile log4j.logger.common.mongodb.service.FileOptService=DEBUG,consoleAppender1,debugfile #指定SQL 輸出 #log4j.logger.java.sql.ResultSet=INFO,consoleAppender1 log4j.logger.org.apache=ERROR,errorfile #log4j.logger.java.sql.Connection=DEBUG,debugfile #log4j.logger.java.sql.Statement=DEBUG,consoleAppender2 #log4j.logger.java.sql.PreparedStatement=DEBUG,debugfile #輸出sql到文件 #處理Spring,mybatis錯誤級別日志的寫到異常文件 log4j.logger.org.springframework=ERROR,errorfile log4j.logger.org.mybatis=ERROR,errorfile #cxf log4j.logger.org.apache.cxf=info,consoleAppender1,debugfile #不附加,作用就是 避免重復打印 log4j.additivity.controller=false log4j.additivity.service=false log4j.additivity.dao=false log4j.additivity.org.apache.cxf=false log4j.additivity.common.mongodb.service.FileOptService=false
配置分析:
1>. 最最重要的兩個概念:Logger(繼承層次)和Appender(輸出控制);(請參考Log4J手冊)
2>. rootLogger 總是存在於log4j中,即使沒有顯示配置也是存在的,並且默認輸出級別為DEBUG;
3>. ConsoleAppender 輸出到控制台;RollingFileAppender 輸出到指定路徑下的文件中;兩者為log4j中的類,都實現了Appender類;
4>. File,MaxBackupIndex(保留文件數量),layout,MaxFileSize 皆為設置的屬性;
5>. additivity 限制appender的疊加性,使同一輸出不至於多次輸出;
6>. logger 為 rootLogger 的子集,可以自定義子集的輸出級別。
7>.輸出級別越低,輸出的數量更多;級別更高,就不會輸出低級別的日志;
日志級別:
TRACE->DEBUG-> INFO-> WARN->ERROR->FATAL
圖一:
圖二:
輸出格式:
3.談下思想
思想:Log4j真的很簡單,簡單到令人發指的地步。不是要記錄日志嗎?那就給你一個Log,然后你用Log來寫東西就行了;
Log.class中輸出級別對應的方法
樣例
package test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class Test { static Log log = LogFactory.getLog(Test.class);//這里的“Test.class”事實上傳進去的是Test這個類的完整路徑(包名+類名),“test.Test” 這樣如果存在“test”這個Log那么Test這個Log就繼承它,否則就繼承rootLogger public void log(){ log.debug("Debug info."); log.info("Info info"); log.warn("Warn info"); log.error("Error info"); log.fatal("Fatal info"); } /** * @param args */ public static void main(String[] args) { Test test = new Test(); test.log(); } }
4.默認的log4j初始化過程
Logger類的靜態初始化塊(static initialization block)中對log4j的環境做默認的初始化。
* 如果程序員已經通過設置系統屬性的方法來配置了log4j環境,則不需要再顯式地調用XXXConfigurator.configure()方法來配置log4j環境了。
Logger的靜態初始化塊在完成初始化過程時將檢查一系列log4j定義的系統屬性。它所做的事情如下:
1>. 檢查系統屬性log4j.defaultInitOverride,如果該屬性被設置為false,則執行初始化;否則(只要不是false,無論是什么值,甚至沒有值,都是否則),跳過初始化。
2>. 把系統屬性log4j.configuration的值賦給變量resource。如果該系統變量沒有被定義,則把resource賦值為"log4j.properties"。注意:在apache的log4j文檔中建議使用定義log4j.configuration系統屬性的方法來設置默認的初始化文件是一個好方法。
3>. 試圖把resource變量轉化成為一個URL對象url。如果一般的轉化方法行不通,就調用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)方法來完成轉化。
4>. 如果url以".xml"結尾,則調用方法DOMConfigurator.configure(url)來完成初始化;否則,則調用方法PropertyConfigurator.configure(url)來完成初始化。如果url指定的資源不能被獲得,則跳出初始化過程。
5.Logger 兩點說明
1>. 用同名參數調用Logger.getLogger(String name)將返回同一個logger的引用。故可以在一個地方配置logger,在另外一個地方獲得配置好的logger,而無須相互間傳遞logger的引用。
2>. logger的創建可以按照任意的順序,即,父logger可以后於子logger被創建。log4j將自動維護logger的繼承樹。
參考資料:
1>. http://www.cnblogs.com/Fskjb/archive/2011/01/29/1947592.html
2>. https://logging.apache.org/log4j/2.x/manual/architecture.html
3>. http://www.cnblogs.com/suman/archive/2010/10/23/1858864.html