2010年8月24日 星期二

[ Java套件介紹 ] Apache-Log4j : 方便好用的Log工具

前言 : 

程式裡為了追蹤錯誤而寫一些log是很平常的事,最簡單的就是用System.out.println將log 寫到console或container指定的檔案,這個方法簡單,但是因提供的資訊不足,對於追蹤錯誤通常不太夠,apache提供的Log4j是目前最流行的工具,因為它小巧卻又功能強大,底下將簡單的介紹Log4j (這好像是我的風格?),如果要精通,可以參考官方網站的文件,官方網站在http://logging.apache.org/log4j/docs/index.html
首先在使用 Log4j 時我們要先將一些 jar 檔匯入,如果有出現意外的 Exception 記得先找看看是不是有 jar 檔沒有匯入,類似的問題將 Exception 丟到 google 就會有解答,所以在這邊就不詳細說明。
只列出官方的使用前須知:http://logging.apache.org/log4j/1.2/faq.html#1.3 。


使用準備 : 
1. 請到Apache Log4j官網 download log4j的 library. 
2. 將log4j-x.x.xx.jar 加入Classpath, 或由IDE進行設定. 

使用說明 : 
* 階層 
Log4j將輸出訊息分成五個等級,分別為DEBUG、INFO、WARN、ERROR、FATAL,在上面設定檔將輸出等級設為INFO,就表示INFO~FATAL等級的訊息將會輸出,因此DEBUG等級的訊息就會被忽略,如果將設定檔的第一行改為log4j.rootLogger=DEBUG, A1, A2,就會兩個訊息都輸出了。除了這五個等級外,也可以設為ALL或OFF, ALL很示全部訊息都輸出,OFF則表示不輸出訊息。


* 輸出格式(Pattern) 
%c | 輸出日誌訊息所屬的類別的全名
%d | 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyy-MM-dd HH:mm:ss }。
%l | 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。
%m | 輸出訊息,如log(message)中的message。
%n | 輸出一個列尾符號。
%p | 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。
%r | 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
%t | 輸出產生該日誌事件的線程名。
%r | 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
%f | 輸出日誌訊息所屬的類別的類別名。


簡單範例 : 
* 將Log 訊息將會導到Console, 並且依照指定的Pattern列印出來. 
  1. package gays.apache.log4j;  
  2.   
  3. import org.apache.log4j.ConsoleAppender;  
  4. import org.apache.log4j.Level;  
  5. import org.apache.log4j.Logger;  
  6. import org.apache.log4j.PatternLayout;  
  7.   
  8. /** 
  9. * 簡介 : Here is a very simplistic example of a program implementing a SimpleLayout and FileAppender: 
  10. *       Log 訊息將會導到Console, 並且依照指定的Pattern列印出來. 
  11. * 來源 : http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/log4j/log4j.html#LOG4J-Basics-Logger 
  12. * @author JohnLee 
  13. */  
  14. public class Log4jConsoleAppender {  
  15.       
  16.     public static void main(String args[]){  
  17.         Logger logger = Logger.getLogger(Log4jConsoleAppender.class);  
  18.   
  19.         // Note, %n is newline  
  20.         String pattern = "Milliseconds since program start: %r %n";  
  21.         pattern += "Classname of caller: %C %n";  
  22.         pattern += "Date in ISO8601 format: %d{ISO8601} %n";  
  23.         pattern += "Location of log event: %l %n";  
  24.         pattern += "Message: %m %n %n";  
  25.   
  26.         PatternLayout layout = new PatternLayout(pattern);  
  27.         ConsoleAppender appender = new ConsoleAppender(layout);  
  28.   
  29.         logger.addAppender(appender);  
  30.         logger.setLevel((Level) Level.DEBUG);  
  31.   
  32.         logger.debug("Here is some DEBUG");  
  33.         logger.info("Here is some INFO");  
  34.         logger.warn("Here is some WARN");  
  35.         logger.error("Here is some ERROR");  
  36.         logger.fatal("Here is some FATAL");          
  37.     }  
  38. }  

* 將Log訊息導到指定檔案 
  1. package gays.apache.log4j;  
  2.   
  3. import org.apache.log4j.FileAppender;  
  4. import org.apache.log4j.Level;  
  5. import org.apache.log4j.Logger;  
  6. import org.apache.log4j.SimpleLayout;  
  7.   
  8. /** 
  9. * 簡介 : Here is a very simplistic example of a program implementing a SimpleLayout and FileAppender: 
  10. *       Log 訊息將會導到檔案 'output1.txt'裡, 預設該檔案會在Project目錄下. 
  11. * 來源 : http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/log4j/log4j.html#LOG4J-Basics-Logger 
  12. * @author JohnLee 
  13. */  
  14. public class Log4jSimpleFileAppender {  
  15.       
  16.     public static void main(String args[]){  
  17.         Logger logger = Logger.getLogger(Log4jSimpleFileAppender.class);  
  18.         SimpleLayout layout = new SimpleLayout();  
  19.   
  20.         FileAppender appender = null;  
  21.         try {  
  22.             appender = new FileAppender(layout, "output1.txt"false);  
  23.         } catch (Exception e) {  
  24.         }  
  25.   
  26.         logger.addAppender(appender);  
  27.         logger.setLevel((Level) Level.DEBUG);  
  28.   
  29.         logger.debug("Here is some DEBUG");  
  30.         logger.info("Here is some INFO");  
  31.         logger.warn("Here is some WARN");  
  32.         logger.error("Here is some ERROR");  
  33.         logger.fatal("Here is some FATAL");  
  34.     }  
  35. }  

* 利用Configuration 對Log4j進行設定Appender, Log level 與 Pattern 
->Log4j.properties 
log4j.rootLogger=Info, A1, A2

# A1 is set to be a ConsoleAppender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss}][%p][%C-%L] %m%n

# A2 is set to be a file
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss}][%p][%C-%L] %m%n
log4j.appender.A2.File=./log/Log4j.log

->範例代碼 : 
  1. package gays.apache.log4j;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.apache.log4j.PropertyConfigurator;  
  5.   
  6. /** 
  7. * 簡介 : 請參考以下相關Log4j教學, 在此會讀取Configuration獲取 Log4j的設定, 並跟據設定的Appender將訊息輸出. 
  8. *       * http://my.so-net.net.tw/idealist/Java/Log4j.html 
  9. *       * http://werdna1222coldcodes.blogspot.com/2009/11/javalog4j.html 
  10. *       * http://www.vaannila.com/log4j/log4j-configuration.html 
  11. *       * http://logging.apache.org/log4j/ ~ Apache log4j 官網 
  12. *       * http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/log4j/log4j.html#LOG4J-Basics-Logger 
  13. *       * http://logging.apache.org/log4j/1.2/manual.html ~ Apache log4j 教學 (Short introduction to log4j)  
  14. * @author JohnLee 
  15. * 
  16. */  
  17. public class Log4jDemo {  
  18.     public static void main(String args[]){  
  19.         PropertyConfigurator.configure("bin/gays/apache/log4j/Log4j.properties");  
  20.         Logger logger = Logger.getLogger(Log4jDemo.class);  
  21.           
  22.         // 對應的 Log4j.properties 設定要在等級 Info 之上才會顯示,所以logger.debug 不會出現  
  23.         logger.debug("Hello Log4j, this is debug message");  
  24.           
  25.         // 以下的訊息會出現在 console 和 log file 中  
  26.         logger.info("Hi Log4j, this will appear in console and log file");  
  27.         logger.error("This is error message!!!");  
  28.     }  
  29.       
  30. }  

補充說明 : 
* http://my.so-net.net.tw/idealist/Java/Log4j.html 
* http://werdna1222coldcodes.blogspot.com/2009/11/javalog4j.html 
* http://www.vaannila.com/log4j/log4j-configuration.html 
* http://logging.apache.org/log4j/ ~ Apache log4j 官網 
* http://supportweb.cs.bham.ac.uk/documentation/tuto...log4j.html#LOG4J-Basics-Logger 
* http://logging.apache.org/log4j/1.2/manual.html ~ Apache log4j 教學 (Short introduction to log4j)

4 則留言:

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...