1. 程式人生 > >Log4j 列印堆疊資訊

Log4j 列印堆疊資訊

      前幾天同事突然問了個問題讓我不大理解,先在這裡記錄下。

     1.log4j.error和e.printstacktrace()有什麼區別?

     

      我的理解當然很簡單,e.printstacktrace()是在控制檯輸出來的,logger4j是在日誌中輸出來的。

  後來同事打了個啞謎還有一個是關係到buffer上的區別,對於這點其實我還是沒有怎麼搞明白,有知道的小夥伴可以來解答下。


    2.logger.error(exception)和logger.error("",exception) 看很多人都是後者的寫法,為什麼就不能直接用logger.error(exception)呢?



    對於這個問題我們可以對比下輸出結果就知道了,發現前者只打印一行報錯資訊,後者卻可以打印出堆疊資訊。其實這個問題可以在原始碼中探索出來。原來前者只把excetion.toString()當成message,異常資訊設定成null了。

   

Java程式碼  收藏程式碼
  1. /** 
  2.    Log a message object with the {@link Level#ERROR ERROR} Level. 
  3.    This method first checks if this category is ERROR 
  4.    enabled by comparing the level of this category with {@link
     
  5.    Level#ERROR ERROR} Level. If this category is ERROR 
  6.    enabled, then it converts the message object passed as parameter 
  7.    to a string by invoking the appropriate {@link 
  8.    org.apache.log4j.or.ObjectRenderer}. It proceeds to call all the 
  9.    registered appenders in this category and also higher in the
     
  10.    hierarchy depending on the value of the additivity flag. 
  11.    WARNING Note that passing a {@link Throwable} to this 
  12.    method will print the name of the Throwable but no 
  13.    stack trace. To print a stack trace use the {@link #error(Object, 
  14.    Throwable)} form instead. 
  15.    @param message the message object to log */  
  16.  public  
  17.  void error(Object message) {  
  18.    if(repository.isDisabled(Level.ERROR_INT))  
  19.      return;  
  20.    if(Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel()))  
  21.      forcedLog(FQCN, Level.ERROR, message, null);  
  22.  }  
  23.  /** 
  24.   Log a message object with the ERROR level including 
  25.   the stack trace of the {@link Throwable} t passed as 
  26.   parameter. 
  27.   See {@link #error(Object)} form for more detailed information. 
  28.   @param message the message object to log. 
  29.   @param t the exception to log, including its stack trace.  */  
  30.  public  
  31.  void error(Object message, Throwable t) {  
  32.    if(repository.isDisabled(Level.ERROR_INT))  
  33.      return;  
  34.    if(Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel()))  
  35.      forcedLog(FQCN, Level.ERROR, message, t);  
  36.  }  




   具體的demo程式碼如下:

  

Java程式碼  收藏程式碼
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileNotFoundException;  
  4. import java.io.InputStream;  
  5. import org.apache.log4j.Logger;  
  6. public class TestLogger {  
  7.     private Logger logger=Logger.getLogger(TestLogger.class);  
  8.     public static void main(String[] args) {  
  9.         File file=new File("d:\\adfasf.txt");  
  10.         try {  
  11.             InputStream input=new FileInputStream(file);  
  12.         } catch (FileNotFoundException e) {  
  13.             // TODO Auto-generated catch block  
  14.             e.printStackTrace();  
  15.             new TestLogger().getLogger().info(e.toString());  
  16.             new TestLogger().getLogger().error(e);  
  17. //          new TestLogger().getLogger().error("error:",e);  
  18.         }  
  19.     }  
  20.     public Logger getLogger() {  
  21.         return logger;  
  22.     }  
  23.     public void setLogger(Logger logger) {  
  24.         this.logger = logger;  
  25.     }  
  26. }