1. 程式人生 > >Log4j 學習筆記(二)Log4j快速入門配置檔案log4j.properties

Log4j 學習筆記(二)Log4j快速入門配置檔案log4j.properties

在該教程中,我們將展示使用經典的log4j 1.2.x記錄java應用程式中的debug或者error級別的日誌資訊。

1. 工程目錄

Maven風格的工程目錄結構:

這裡寫圖片描述

2. 引用Log4j

在pom.xml中引入依賴:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

如果你不是maven的使用者,請移步

Log4j官網下載jar包手動新增到你的工程的library中。

3. log4j.properties

建立一個log4j.properties檔案放到resources 目錄下。

注意
1.單獨的java應用,確保編譯後log4j.properties在你的project/classes目錄下
2.java web應用,確保編譯後log4j.properties在WEB-INF/classes目錄下

log4j.properties

# 日誌收集器的操作
log4j.rootLogger=DEBUG, stdout, file

# 將日誌資訊定向到控制檯
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # 將日誌資訊定向到檔案中 log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\log4j-application.log log4j.appender.file.MaxFileSize=5MB log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

注意:為了更深理解ConversionPattern的配置,可以參見Log4j模式佈局指南

我們來梳理一下:

  • %d{yyyy-MM-dd HH:mm:ss} = 設定日期時間格式, 參考 SimpleDateFormat JavaDoc.
  • %-5p = 設定日誌的優先順序, 像DEBUG 或者ERROR級別. -5 是可選的, 為了列印漂亮的格式.
  • %c{1} = 我們通過getLogger()得到的日誌名字, 可以參見Log4j模式佈局指南.
  • %L = 記錄行號.
  • %m%n = 日誌和中斷行的資訊.

日誌資訊示例:

2014-07-02 20:52:39 DEBUG className:200 - This is debug message
2014-07-02 20:52:39 DEBUG className:201 - This is debug message2

4. Demo - 怎樣記錄日誌資訊?

要記錄日誌訊息,首先需要宣告一個final static的logger並定一個名字,通常我們使用包名.類名的全名形式。

final static Logger logger = Logger.getLogger(classname.class);

然後,日誌資訊也有不同的級別,例如,debug、info、warn、error和fatal。通常我們不只需要記錄debug和error級別的日誌。

//logs a debug message
if(logger.isDebugEnabled()){
    logger.debug("This is debug");
}

//logs an error message with parameter
logger.error("This is error : " + parameter);

//logs an exception thrown from somewhere
logger.error("This is error", exception);

示例:設定debug級別日誌

log4j.properties:

log4j.rootLogger=DEBUG, stdout

#...

HelloExample.java:

package org.byron4j.helloLog4j;

import org.apache.log4j.Logger;

public class HelloExample{

    final static Logger logger = Logger.getLogger(HelloExample.class);

    public static void main(String[] args) {

        HelloExample obj = new HelloExample();
        obj.runMe("http://blog.csdn.net/zixiao217");

    }

    private void runMe(String parameter){

        if(logger.isDebugEnabled()){
            logger.debug("This is debug : " + parameter);
        }

        if(logger.isInfoEnabled()){
            logger.info("This is info : " + parameter);
        }

        logger.warn("This is warn : " + parameter);
        logger.error("This is error : " + parameter);
        logger.fatal("This is fatal : " + parameter);

    }

}

日誌輸出:

2016-10-25 20:52:39 DEBUG HelloExample:19 - This is debug : http://blog.csdn.net/zixiao217
2016-10-25 20:52:39 INFO  HelloExample:23 - This is info : http://blog.csdn.net/zixiao217
2016-10-25 20:52:39 WARN  HelloExample:26 - This is warn : http://blog.csdn.net/zixiao217
2016-10-25 20:52:39 ERROR HelloExample:27 - This is error : http://blog.csdn.net/zixiao217
2016-10-25 20:52:39 FATAL HelloExample:28 - This is fatal : http://blog.csdn.net/zixiao217

示例:設定error級別日誌

log4j.properties:

log4j.rootLogger=ERROR, stdout

#...

執行HelloExample.java將輸出:

2016-10-25 20:56:02 ERROR HelloExample:27 - This is error : http://blog.csdn.net/zixiao217
2016-10-25 20:56:02 FATAL HelloExample:28 - This is fatal : http://blog.csdn.net/zixiao217

我們看一下Log4j的Priority 類:

package org.apache.log4j;

public class Priority {

  public final static int OFF_INT = Integer.MAX_VALUE;
  public final static int FATAL_INT = 50000;
  public final static int ERROR_INT = 40000;
  public final static int WARN_INT  = 30000;
  public final static int INFO_INT  = 20000;
  public final static int DEBUG_INT = 10000;
    //public final static int FINE_INT = DEBUG_INT;
  public final static int ALL_INT = Integer.MIN_VALUE;

  ...
}

如果在log4j.properties定義了日誌級別,則列印日支時只有級別值大於等於它的才會記錄。

5. Demo - 怎樣記錄一個異常?

示例展示了使用Log4j記錄異常資訊:

package org.byron4j.helloLog4j;

import org.apache.log4j.Logger;

public class HelloExample2{

    final static Logger logger = Logger.getLogger(HelloExample2.class);

    public static void main(String[] args) {

        HelloExample2 obj = new HelloExample2();

        try{
            obj.divide();
        }catch(ArithmeticException ex){
            logger.error("Sorry, something wrong!", ex);
        }


    }

    private void divide(){

        int i = 10 /0;

    }

}

輸出:

2016-10-26 00:52:39 ERROR HelloExample2:15 - Sorry, something wrong!
java.lang.ArithmeticException: / by zero
    at org.byron4j.helloLog4j.HelloExample2.divide(HelloExample2.java:22)
    at org.byron4j.helloLog4j.HelloExample2.main(HelloExample2.java:13)

入門示例結束了。