log4j使用


                           

  類圖鎮樓

 

                          

 

 

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

 

  圖一:

  log4j使用手冊介紹

 

  圖二:

  

 

  輸出格式:

    

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM