1. 程式人生 > >(轉)log4j(一)——為什麽要用log4j?

(轉)log4j(一)——為什麽要用log4j?

控制 clas 姓名 private 開發環境 負責人 getname 麻煩 方法名

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?