Logger之Logger.getLogger(CLass)

以前一直在使用System.out.println()來調試.可是用這種方式開發項目部署到生產環境,會由於衆多的控制檯輸出下降應用的性能.這時候Log4J就成爲可平衡開發和部署應用的利器了.html

  在項目中使用Log4J並非一件困難的事情,簡單粗暴的方式就是在每一個類A中聲明一個Logger私有屬性java

 

 
  1. private static Logger logger = Logger.getLogger(A.class);  
 private static Logger logger = Logger.getLogger(A.class);

 

這樣雖然簡單,可是帶來有兩個問題:apache

 1.增長系統開銷-每一個使用Log4J的類都增長了對象屬性.app

 2.麻煩:每一個使用Logger的類都要重複聲明上面Logger對象.性能

其實不難發現能夠使用重構手法,聲明一個公用的類Log4jUtils,處理Logger的公共操做.測試

不過呢,問題不這麼簡單.首先要解決一個問題,Logger.getLogger(A.class)中的A.class有什麼用?A.class能夠不能夠瞎寫?spa

先作個試驗,先簡單配置log4j.properties文件.net

 

[html] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1. #日誌級別,輸出目的地  
  2. log4j.rootLogger=debug,stdout  
  3.   
  4. log4j.appender.stdout=org.apache.log4j.Conso  
  5. leAppender  
  6. log4j.appender.stdout.Target=System.out  
  7. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  8. #輸出格式  
  9. log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n  
#日誌級別,輸出目的地
log4j.rootLogger=debug,stdout

log4j.appender.stdout=org.apache.log4j.Conso
leAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#輸出格式
log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n


新建一個測試類debug

 

 

[java] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1. import org.apache.log4j.Logger;  
  2.   
  3. /** 
  4.  * Created by li on 2015/5/24. 
  5.  */  
  6.   
  7. public class LoggerTest {  
  8.     private static Logger logger = Logger.getLogger(Object.class);  
  9.   
  10.     public static void main(String[] args) {  
  11.         logger.debug("Hello World!");  
  12.     }  
  13. }  
import org.apache.log4j.Logger;

/**
 * Created by li on 2015/5/24.
 */

public class LoggerTest {
    private static Logger logger = Logger.getLogger(Object.class);

    public static void main(String[] args) {
        logger.debug("Hello World!");
    }
}

 

查看結果:調試

結合log4j.properties配置的

[html] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1. log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n  
log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n

不難知道%c這時候將LoggerTest類的代碼修改

 

 

[java] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1. private static Logger logger = Logger.getLogger(LoggerTest.class);  
private static Logger logger = Logger.getLogger(LoggerTest.class);

 

運行結果變爲:

要的結果終於出現了.至此,明白了getLogger(class)的參數用途:追蹤產生此日誌的類.

 

如今就出現了新的問題:若要使用一個類Log4jUtils來專門處理Logger對象的聲明等操做,那麼如何處理getLogger(class)的參數問題?

也就是如何在Log4jUtils獲得調用logger對象的類型.

 

解決這個困難能夠是使用Java的反射機制

看下面的代碼:

類Log4jUtils:

 

[java] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.  * Created by li on 2015/5/23. 
  3.  */  
  4. public class Log4JUtils{  
  5.   
  6.     private static Logger logger =  null;  
  7.   
  8.     public static Logger getLogger(){  
  9.        if (null == logger){  
  10.             //Java8 廢棄了Reflection.getCallerClass()  
  11.            logger = Logger.getLogger(Reflection.getCallerClass().getName());  
  12.            logger.debug("調用者類名"+Reflection.getCallerClass().getName());  
  13.        }  
  14.         return logger;  
  15.     }  
  16. }  
/**
 * Created by li on 2015/5/23.
 */
public class Log4JUtils{

    private static Logger logger =  null;

    public static Logger getLogger(){
       if (null == logger){
            //Java8 廢棄了Reflection.getCallerClass()
           logger = Logger.getLogger(Reflection.getCallerClass().getName());
           logger.debug("調用者類名"+Reflection.getCallerClass().getName());
       }
        return logger;
    }
}



 


修改類LoggerTest的代碼:

 

 

[html] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1. /**  
  2.  * Created by li on 2015/5/24.  
  3.  */  
  4.   
  5. public class LoggerTest {  
  6. //    private static Logger logger = Logger.getLogger(LoggerTest.class);  
  7.   
  8.     public static void main(String[] args) {  
  9.         Log4JUtils.getLogger().debug("Hello World!");  
  10.     }  
  11. }  
/**
 * Created by li on 2015/5/24.
 */

public class LoggerTest {
//    private static Logger logger = Logger.getLogger(LoggerTest.class);

    public static void main(String[] args) {
        Log4JUtils.getLogger().debug("Hello World!");
    }
}

運行結果:

 

看到這個結果就很爽了.之後項目就能夠放棄使用System.out.println()打印語句了.

相關文章
相關標籤/搜索