java中Log4J的使用筆記

Franson發表於2016-07-04

使用Log4J,程式設計師可以控制日誌資訊輸送的目的地,包括控制檯,檔案,GUI元件和NT事件記錄器,也可以控制每一條日誌的輸出格式,或通過定義每一條日誌資訊的級別,更加細緻地控制日誌的生成過程。

Log4j的組成:
Log4j由三個重要的組成構成:日誌記錄器(Loggers),輸出端(Appenders)和日誌格式化器(Layout)。
Logger:控制要啟用或禁用哪些日誌記錄語句,並對日誌資訊進行級別限制:Appenders指定了日誌將列印到控制檯還是檔案中;而Layout則控制日誌資訊的顯示格式。

Log4j的組成:
Log4j由三個重要的組成構成:日誌記錄器(Loggers),輸出端(Appenders)和日誌格式化器(Layout)。
Logger:控制要啟用或禁用哪些日誌記錄語句,並對日誌資訊進行級別限制:Appenders指定了日誌將列印到控制檯還是檔案中;而Layout則控制日誌資訊的顯示格式。

A).Logger物件的獲得或建立
Logger被指定為實體,由一個String類的名字識別。Logger的名字是大小寫敏感的,且名字之間具有繼承關係,子名用父名作為字首,用點“.”分隔,例如x.y是x.y.z的父親。
root Logger(根Logger)是所有Logger的祖先,它有如下屬性:
1.它總是存在的。
2.它不可以通過名字獲得。
root Logger可以通過以下語句獲得:

public static Logger Logger.getRootLogger();

 

或:

public static Logger Logger.getLogger(Class clazz)

 

其中呼叫Logger.getLogger(Class clazz)是目前ogger物件最理想的方法。

B)日誌級別
每個Logger都被了一個日誌級別(log level),用來控制日誌資訊的輸出。日誌級別從高到低分為:
A:off         最高等級,用於關閉所有日誌記錄。
B:fatal       指出每個嚴重的錯誤事件將會導致應用程式的退出。
C:error      指出雖然發生錯誤事件,但仍然不影響系統的繼續執行。
D:warm     表明會出現潛在的錯誤情形。
E:info         一般和在粗粒度級別上,強調應用程式的執行全程。
F:debug     一般用於細粒度級別上,對除錯應用程式非常有幫助。
G:all           最低等級,用於開啟所有日誌記錄。

上面這些級別是定義在org.apache.log4j.Level類中。Log4j只建議使用4個級別,優先順序從高到低分別是error,warn,info和debug。通過使用日誌級別,可以控制應用程式中相應級別日誌資訊的輸出。例如,如果使用b了info級別,則應用程式中所有低於info級別的日誌資訊(如debug)將不會被列印出來。

package log4j;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class Log4jTest {

    public static void main(String[] args) {
        
        Logger logger = Logger.getLogger(Log4jTest.class);
        
        //使用預設的配置資訊,不需要寫log4j.properties
        BasicConfigurator.configure();
        //設定日誌輸出級別為info,這將覆蓋配置檔案中設定的級別
        logger.setLevel(Level.INFO);
        //下面的訊息將被輸出
        logger.info("this is an info");
        logger.warn("this is a warn");
        logger.error("this is an error");
        logger.fatal("this is a fatal");

    }

}

C)輸出端Appender
Appender用來指定日誌資訊輸出到哪個地方,可以同時指定多個輸出目的地。Log4j允許將資訊輸出到許多不同的輸出裝置中,一個log資訊輸出目的地就叫做一個Appender。
每個Logger都可以擁有一個或多個Appender,每個Appender表示一個日誌的輸出目的地。可以使用Logger.addAppender(Appender app)為Logger增加一個Appender,也可以使用Logger.removeAppender(Appender app)為Logger刪除一個Appender。
以下為Log4j幾種常用的輸出目的地。
a:org.apache.log4j.ConsoleAppender:將日誌資訊輸出到控制檯。
b:org.apache.log4j.FileAppender:將日誌資訊輸出到一個檔案。
c:org.apache.log4j.DailyRollingFileAppender:將日誌資訊輸出到一個日誌檔案,並且每天輸出到一個新的日誌檔案。
d:org.apache.log4j.RollingFileAppender:將日誌資訊輸出到一個日誌檔案,並且指定檔案的尺寸,當檔案大小達到指定尺寸時,會自動把檔案改名,同時產生一個新的檔案。
e:org.apache.log4j.WriteAppender:將日誌資訊以流格式傳送到任意指定地方。
f::org.apache.log4j.jdbc.JDBCAppender:通過JDBC把日誌資訊輸出到資料庫中。

日誌格式化器Layout
有三種:
HTMLLayout:格式化日誌輸出為HTML表格形式:如下圖所示:

SimpleLayout:以一種非常簡單的方式格式化日誌輸出,它列印三項內容:級別-資訊。如:INFO - info

PatternLayout::根據指定的轉換模式格式化日誌輸出,或者如果沒有指定任何轉換模式,就使用預設的轉化模式格式。
下面的程式碼實現了SimpleLayout和FileAppender的程式。

public static void main(String[] args) {
        
        Logger logger = Logger.getLogger(Log4jTest.class);        
        SimpleLayout layout = new SimpleLayout();
        //HTMLLayout  layout = new HTMLLayout();
        FileAppender appender = null;
        try
        {
            //把輸出端配置到out.txt
            appender = new FileAppender(layout,"out.txt",false);
        }catch(Exception e)
        {            
        }
        logger.addAppender(appender);//新增輸出端
        logger.setLevel((Level)Level.DEBUG);//覆蓋配置檔案中的級別
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.fatal("fatal");
    }

Log4j的配置
配置Log4j環境就是指配置root Logger,包括把Logger為哪個級別,為它增加哪些Appender,以及為這些Appender設定Layout等等。因為所有其他的Logger都是root Logger的後代,所以它們都繼承了root Logger的性質。這些可以通過設定系統屬性的方法來隱式地完成,也可以在程式中呼叫XXXConfigurator.configure()方法來顯式地完成。有以下幾種方式來配置Log4j。
A:配置放在檔案裡,通過環境變數傳遞檔名等資訊,利用Log4j預設的初始化過程解析並配置。
B:配置放在檔案裡,通過應用伺服器配置傳遞檔案甸等資訊,利用一個特定的Servlet來完成配置。
C:在程式中呼叫BasicConfigurator.configure()方法。
D:配置放在檔案裡,通過命令列PropertyConfigurator.configure(args[])解析log4j.properties檔案並配置Log4j。
下面對BasicConfigurator.configure()方法和PropertyConfigurator.config()方法分別進行介紹。
BasicConfigurator.configure()方法:
它使用簡單的方法配置Log4j環境。這個方法完成的任務是:
1:用預設的方式建立PatternLayout物件p:

  PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x-%m%n");

2:用p建立ConsoleAppender物件a,目標是System.out,標準輸出裝置:

 ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT);

3:為root Logger增加一個ConsoleAppender p;

 rootLogger.addAppender(a);

4:把rootLogger的log level設定為DUBUG級別;

 

rootLogger.setLevel(Level.DEBUG);

PropertyConfigurator.configure()方法:

當使用以下語句生成Logger物件時:

 static Logger logger = Logger.getLogger(mycalss.class);

如果沒有呼叫BasicConfigurator.configure(),PropertyConfigurator.configure()或DOMConfigurator.configure()方法,Log4j會自動載入CLASSPATH下名為log4j.properties的配置檔案。如果把此配置檔案改為其他名字,例如my.properties,程式雖然仍能執行,但會報出不能正確初始化Log4j系統的提示。這時可以在程式中加上:

PropertyConfigurator.configure("classes/my.properties");

問題即可解決。

相關文章