(轉)log4j(一)——為什麽要用log4j?
1 試驗環境
OS:win7
JDK:jdk7
Log4j:1.2.17(好尷尬,原本是想試驗下log4j2的,結果陰差陽錯用了這個版本,不過幸好,試驗也不白試驗,試驗的作用是一樣的)
2 先看兩個簡單的栗子然後在談為什麽吧!
(1)當我們想打印一些信息時,估計這是最容易想到的一種方式,將我們想打印的信息,打印到控制臺中
/** * Created by godtrue */ public class UnLog4j { public static void main(String[]args){ //打印日誌信息 System.out.println("hello log4j !"); } }
(2)這個是使用log4j日誌框架,我覺得最簡單的一種實現方式,好像比(1) 麻煩不少,我們好像沒有必要非使用log4j日誌框架的,那麽再看看下面的栗子吧!
import org.apache.log4j.BasicConfigurator; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; /** * Created by godtrue */ public class UseLog4j { //日誌記錄器 private static Logger LOGGER = LogManager.getLogger(UseLog4j.class); public static void main(String[]args){ //自動快速地使用缺省Log4j環境 BasicConfigurator.configure(); //打印日誌信息 LOGGER.info("hello log4j !"); } }
(3)這段日誌信息,我們的需求稍微復雜了一點點,我們想區分開來打印的信息的級別,比如:哪些可能是錯誤的情況?哪些可能是警告的情況?以及順便看一下不使用日誌框架時程序運行的效率如何?
import test.log4j.bean.Person;public class UnLog4j { //循環次數 private static long CYCLE = 102; //程序入口——主函數 public static void main(String[]args){ long startTime = System.currentTimeMillis(); for(int i=0;i<CYCLE;i++){ if(i<100){ try{ System.out.println(new Person("godtrue",100/i,‘M‘));//打印對象的信息 }catch(Exception e){ System.out.println(i+"歲的小孩還不存在嘛!");//打印對象的信息 }finally{ System.out.println("現在大部分人的年齡都在0到100歲之間的!");//打印對象的信息 } }else{ System.out.println("我是一棵樹,我今年活了"+i+"歲!哈哈,我厲害吧!");//打印對象的信息 } } System.out.println("此程序的運行時間是:"+(System.currentTimeMillis()-startTime));//打印程序運行的時間 } }
(4)這段日誌信息和(3)的需求一模一樣,使用日誌框架好像更能滿足一些我們的特殊需要啦,是的,這也是為什麽我們選擇使用日誌框架的原因的
import org.apache.log4j.BasicConfigurator; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import test.log4j.bean.Person; public class UseLog4j { //日誌記錄器 private static Logger LOGGER = LogManager.getLogger(UseLog4j.class); //循環次數 private static long CYCLE = 102; //程序入口——主函數 public static void main(String[]args){ long startTime = System.currentTimeMillis(); //自動快速地使用缺省Log4j環境 BasicConfigurator.configure(); for(int i=0;i<CYCLE;i++){ if(i<100){ try{ LOGGER.info(new Person("godtrue",100/i,‘M‘));//打印對象的信息 }catch(Exception e){ LOGGER.error(i+"歲的小孩還不存在嘛!");//打印對象的信息 }finally{ LOGGER.warn("現在大部分人的年齡都在0到100歲之間的!");//打印對象的信息 } }else{ LOGGER.info("我是一棵樹,我今年活了"+i+"歲!哈哈,我厲害吧!");//打印對象的信息 } } LOGGER.debug("此程序的運行時間是:"+(System.currentTimeMillis()-startTime));//打印程序運行的時間 } }
(5)這段代碼平淡無奇,是用來輔助我們測試的,不過實際的開發中使用這類代碼的地方可以說是到處都是
public class Person { //姓名 private String name; //性別 private char sex; //年齡 private int age; //有參構造函數 public Person(String name, int age, char sex) { this.name = name; this.age = age; this.sex = sex; } //無慘構造函數 public Person() { } @Override public String toString() { return "Person{" + "name=‘" + name + ‘\‘‘ + ", sex=" + sex + ", age=" + age + ‘}‘; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char isSex() { return sex; } public void setSex(char sex) { this.sex = sex; } }
3 看完栗子後的感想
(1)很明顯我們在編寫代碼的時候有各種需要打印日誌的需求,比如:我們調試代碼的時候;我們的應用出現了問題,我們分析、定位、解決問題的時候;我們想將某些日誌信息作為離線的業務數據分析的時候等等
(2)最簡單的打印日誌的方式就是使用系統本身的輸出語句,不過對於大多數需求這種方式都是不能滿足的
(3)於是我們的目光可能會向編寫一個專門打印日誌信息的工具類轉移,不過有人更近了一步,寫出了一個日誌框架供我們使用
(4)使用日誌框架的好處顯而易見,方便、自在、功能強大能夠滿足各種需求,不好的地方也是有的,比如:如果你也進行了試驗你會發現,程序變慢了,需要一定的時間和精力作為學習的成本
(5)日誌框架都是能控制什麽哪?那我們需要打印的日誌都能滿足什麽樣的需求哪?通常我們希望一個日誌框架能夠靈活的做到以下三點:
5-1:能夠控制日誌信息想往哪裏打就往哪裏打,比如:控制臺、文件、郵箱、數據庫等等
5-2:能夠控制日誌信息想怎麽打就怎麽打,比如:我想要打印時間、程序的名稱、程序的方法名、程序的行號、線程的名稱等等
5-3:能夠控制日誌信息想打什麽打什麽,不想打的就不打,日誌信息是分級別的,有時候我只想看錯誤的信息或者警告的信息,有時候我想看到所有的信息我想調試程序等等
(6)如果有這麽個框架,不是太難使用我也是非常樂意玩玩的,尤其是當程序出現問題的時候,項目負責人讓你趕緊解決問題,這時候有一份日誌文件可供分析就好了!
4 log4j是這樣的一個框架嗎(很明顯它是,要不然我不就白玩了嘛!)?
log4j是Apache的一個開放源代碼的項目,通過使用log4j,我們可以控制日誌信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,我們能夠更加細致地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。
此外,通過log4j其他的語言接口,您可以在C、C++、.Net、PL/SQL程序中使用log4j,其語法和用法與在Java程序中一樣,使得多語言分布式系統得到一個統一一致的日誌組件模塊。而且,通過使用各種第三方擴展,您可以很方便地將Log4j集成到J2EE、JINI甚至是SNMP應用中。
5 記錄日誌信息的作用(通俗的解釋上面已經講了,不過下面的講法顯得更專業一些)
1)監視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統計分析工作;
2)跟蹤代碼運行時軌跡,作為日後審計的依據;
3)擔當集成開發環境中的調試器的作用,向文件或控制臺打印代碼的調試信息。
。
(轉)log4j(一)——為什麽要用log4j?