天天看點

log4j日志使用詳解

log4j日志使用詳解

一、概述

Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志資訊輸送的目的地是控制台、檔案、GUI元件、甚至是套接口伺服器、NT的事件記錄器、UNIX Syslog守護程序等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志資訊的級别,我們能夠更加細緻地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個配置檔案來靈活地進行配置,而不需要修改應用的代碼。

  

  此外,通過Log4j其他語言接口,您可以在C、C++、.Net、PL/SQL程式中使用Log4j,其文法和用法與在Java程式中一樣,使得多語言分布式系統得到一個統一一緻的日志元件子產品。而且,通過使用各種第三方擴充,您可以很友善地将Log4j內建到J2EE、JINI甚至是SNMP應用中。

二,使用前的準備。

1、下載下傳log4j 位址為:http://jakarta.apache.org/log4j/docs/download.html.

2、你可能要用到的jar檔案有:   如果需要将日志發送到郵箱,則需要javamail API,JAF API (the JavaBeans Activation Framework)

下載下傳位址:   http://java.sun.com/products/javamail/

http://java.sun.com/beans/glasgow/jaf.html

   如果需要jms的支援,則需要jms API 下載下傳位址為:http://java.sun.com/products/jms/vendors.html

三, Log4j介紹

Log4j由三個重要的元件構成:日志資訊的優先級 priority,日志資訊的輸出目的地Appender,日志資訊的輸出格式(布局)layout。

1、日志的優先級,

從低到高,依次有:DEBUG,INFO,WARN,ERROR,分别用來指定這條日志資訊的重要程度;如果定義了了輸入的級别為INFO,則隻有等于及高于這個級别的才進行處理,此時将輸入INFO,WARN,ERROR。值得注意的是,級别中還有兩個關鍵字,

ALL:列印所有的日志,

OFF:關閉所有的日志輸出。

2、輸出端 Appender

log4j提供了以下幾種常用的輸出目的地:

org.apache.log4j.ConsoleAppender,将日志資訊輸出到控制台

org.apache.log4j.FileAppender,将日志資訊輸出到一個檔案

org.apache.log4j.DailyRollingFileAppender,将日志資訊輸出到一個,并且每天輸出到一個新的日志檔案,按照不同的配置可以定義每月一個日志檔案,或者每周,每天,每小時,每分鐘等輸出一個新的日志檔案。

org.apache.log4j.RollingFileAppender,将日志資訊輸出到一個檔案,通過指定檔案的的尺寸,當檔案大小到達指定尺寸的時候會自動把檔案改名,如名為example.log的檔案會改名為example.log.1,同時産生一個新的example.log檔案。如果新的檔案再次達到指定尺寸,又會自動把檔案改名為example.log.2,同時産生一個example.log檔案。依此類推,直到example.log. MaxBackupIndex,MaxBackupIndex的值可在配置檔案中定義。

org.apache.log4j.WriterAppender,将日志資訊以流格式發送到任意指定的地方。

org.apache.log4j.jdbc.JDBCAppender,通過JDBC把日志資訊輸出到資料庫中。

org.apache.log4j.net.SMTPAppender,将日志資訊以郵件的方式發送到指定的郵箱。

3、輸出格式(布局)layout

通過appender可以控制輸出的目的地,而如果要控制輸出的格式,就可通過log4j的layout元件來實作。通過配置檔案定義一個appender的輸出格式,Log4j提供的布局模式有以下幾種:

org.apache.log4j.ConsoleAppender,輸出到控制台

org.apache.log4j.HTMLLayout,以HTML表格形式布局

org.apache.log4j.PatternLayout,可以靈活地指定布局模式

org.apache.log4j.SimpleLayout,包含日志資訊的級别和資訊字元串

值得一提的是org.apache.log4j.PatternLayout 以Pattern方式的布局,使用Pattern的方式來指定布局。

pattern 的參數如下:ConversionPattern參數的格式含義

格式名 含義

%c 輸出日志資訊所屬的類的全名

%d 輸出日志時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy-MM-dd HH:mm:ss },輸出類似:2002-10-18- 22:10:28 ;比如 %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}.

格式可以參考 java類 SimpleDateFormat,不過 按照此類的設定會影響速度。你可以選擇更快的方式 %d{ISO8601},%d{ABSOLUTE}, %d{RELATIVE}.或者使用log4j的ISO8601DateFormat, AbsoluteTimeDateFormat,RelativeTimeDateFormat 和 DateTimeDateFormat 方式.

%f 輸出日志資訊所屬的類的類名

%l 輸出日志事件的發生位置,即輸出日志資訊的語句處于它所在的類的第幾行

%m 輸出代碼中指定的資訊,如log(message)中的message

%M 輸出日志資訊中所發生的方法名。

%n 輸出一個回車換行符,Windows平台為“/r/n”,Unix平台為“/n”

%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推

%r 輸出自應用啟動到輸出該日志資訊所耗費的毫秒數

%t 輸出産生該日志事件的線程名

四、使用

4.1.1 SimpleLayout 和 FileAppender 方式

以下是以檔案的輸出方式Appender和簡單的布局方式SimpleLayout的例子:

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.log4j.SimpleLayout;

import org.apache.log4j.FileAppender;

public class simpandfile {

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

    public static void main(String args[]) {

       SimpleLayout layout = new SimpleLayout();

       FileAppender appender = null;

       try {

          appender = new FileAppender(layout,"output1.txt",false);

       } catch(Exception e) {}

       logger.addAppender(appender);

       logger.setLevel((Level) Level.DEBUG);

       logger.debug("Here is some DEBUG");

       logger.info("Here is some INFO");

       logger.warn("Here is some WARN");

       logger.error("Here is some ERROR");

       logger.fatal("Here is some FATAL");

    }

}

首先執行個體化Logger對象。static Logger logger = Logger.getLogger(simpandfile.class);然後指定輸出的方式和布局 appender = new FileAppender(layout,"output1.txt",false);logger.addAppender(appender);

最後定義級别:logger.addAppender(appender);這樣完成了log4j日志類的初始化.接着就可以進行日志輸出了。這就是log4j日志類的使用時的一般順序。因以下程式比較簡單,特别的地方将會有注釋,将不再解釋。

4.1.2. HTMLLayout 和 WriterAppender

import java .io.*;

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.log4j.HTMLLayout;

import org.apache.log4j.WriterAppender;

public class htmlandwrite {

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

    public static void main(String args[]) {

       HTMLLayout layout = new HTMLLayout();

       WriterAppender appender = null;

       try {

          FileOutputStream output = new FileOutputStream("output2.html");

          appender = new WriterAppender(layout,output);

       } catch(Exception e) {}

       logger.addAppender(appender);

       logger.setLevel((Level) Level.DEBUG);

       logger.debug("Here is some DEBUG");

       logger.info("Here is some INFO");

       logger.warn("Here is some WARN");

       logger.error("Here is some ERROR");

       logger.fatal("Here is some FATAL");

    }

}

4.1.3. PatternLayout and ConsoleAppender

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.log4j.PatternLayout;

import org.apache.log4j.ConsoleAppender;

public class consandpatt {

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

    public static void main(String args[]) {

       // Note, %n is newline

       String pattern =   "Milliseconds since program start: %r %n";

              pattern += "Classname of caller: %C %n";

              pattern += "Date in ISO8601 format: %d{ISO8601} %n";

              pattern += "Location of log event: %l %n";

              pattern += "Message: %m %n %n";

       PatternLayout layout = new PatternLayout(pattern);

       ConsoleAppender appender = new ConsoleAppender(layout);

       logger.addAppender(appender);

       logger.setLevel((Level) Level.DEBUG);

       logger.debug("Here is some DEBUG");

       logger.info("Here is some INFO");

       logger.warn("Here is some WARN");

       logger.error("Here is some ERROR");

       logger.fatal("Here is some FATAL");

    }

}

4.2 使用配置檔案來定義輸出Appender和布局格式Layout

log4j支援兩種方式的配置方式,.properties 二進制檔案和xml檔案的方式。我們簡單講一下.properties的配置方式後,将主要讨論xml檔案的配置方式。

4.2.1   我們将以.properties檔案的格式定義兩種輸出方式,一種是輸出到檔案中,另一種是輸出到資料庫中。

首先定義simple.properties檔案,檔案定義如下:

#定義了兩個輸出端

log4j.rootLogger = INFO,f,db

# 定義f輸出到檔案,并且檔案是随着大小而增加的

log4j.appender.f = org.apache.log4j.RollingFileAppender

log4j.appender.f.File = F://nepalon//classes//test1.log

log4j.appender.f.MaxFileSize = 1000KB

log4j.appender.f.MaxBackupIndex = 3

log4j.appender.f.layout = org.apache.log4j.PatternLayout

log4j.appender.f.layout.ConversionPattern = %d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

#定義db輸出到資料庫

log4j.appender.db = org.apache.log4j.jdbc.JDBCAppender

log4j.appender.db.BufferSize = 40

log4j.appender.db.Driver = com.microsoft.jdbc.sqlserver.SQLServerDriver

log4j.appender.db.URL = jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=test

log4j.appender.db.User = sa

log4j.appender.db.Password =

log4j.appender.db.layout = org.apache.log4j.PatternLayout

log4j.appender.db.layout.ConversionPattern = INSERT INTO log4j (createDate, thread, priority,

category, message) values('%d{ISO8601}', '%t', '%-5p', '%c', '%m')

然後程式中将引用這配置檔案。定義如下:

import org.apache.log4j.Logger;

import org.apache.log4j.xml.DOMConfigurator;

public class Test {

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

      public static void main(String args[]) {

          //以property方式讀到配置檔案。

    PropertyConfigurator.configure ( "simple.properties" ) ;

 

          logger.debug("Here is some DEBUG");

          logger.info("Here is some INFO");

          logger.warn("Here is some WARN");

          logger.error("Here is some ERROR");

          logger.fatal("Here is some FATAL");

      }

}

4.2.2 以xml配置

程式如下:

import org.apache.log4j.Logger;

import org.apache.log4j.xml.DOMConfigurator;

public class Test {

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

      public static void main(String args[]) {

          //以XML方式讀到配置檔案。

     DOMConfigurator.configure("xmllog4jconfig.xml");

 

          logger.debug("Here is some DEBUG");

          logger.info("Here is some INFO");

          logger.warn("Here is some WARN");

          logger.error("Here is some ERROR");

          logger.fatal("Here is some FATAL");

      }

}

xmllog4jconfig.xml 如下:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="appender" class="org.apache.log4j.FileAppender">

       <param name="File" value="Indentify-Log.txt"/>

       <param name="Append" value="false"/>

       <layout class="org.apache.log4j.PatternLayout">

          <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>

       </layout>

    </appender>

    <root>

       <priority value ="debug"/>

       <appender-ref ref="appender"/>

    </root>

</log4j:configuration>

對比properties方式和xml方式,可以看出他們程式中,除了定義讀取配置檔案的方式不同外,其它的根本就沒有差別了,這也就是log4j的魅力所在了,不需要改變程式,隻需要通過改變定義的配置檔案,我們就可以控制日志的輸出方式,是否輸出,輸出格式。我們可以通過定義不同的xml檔案來控制輸出方式.以下是各種輸出方式與布局的例子。

4.2.3 比較簡單的一個。

<?xml version="1.0" encoding="gb2312" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<!--

   配置輸出的日志目錄為在控制台。

   格式采用為PatternLoyout,并且樣式為:%d{ISO8601} %r [%c :: %p %m]%n

-->   

    <appender name="CA" class="org.apache.log4j.ConsoleAppender">    

       <layout class="org.apache.log4j.PatternLayout">

         <param name="ConversionPattern" value="%d{ISO8601} %r [%c :: %p %m]%n"/>

       </layout>

    </appender>

    <root>

       <priority value ="debug"/>

      <appender-ref ref="CA"/>

    </root>

</log4j:configuration>

4.2.4 檔案的輸出 pattern的布局

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="appender" class="org.apache.log4j.FileAppender">

       <param name="File" value="Indentify-Log.txt"/>

       <param name="Append" value="false"/>

       <layout class="org.apache.log4j.PatternLayout">

          <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>

       </layout>

    </appender>

    <root>

       <priority value ="debug"/>

      <appender-ref ref="appender"/>

    </root>

</log4j:configuration>

4.2.5 控制台的輸出 和簡單的布局

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">

       <layout class="org.apache.log4j.SimpleLayout"/>

    </appender>

    <root>

      <priority value ="debug" />

       <appender-ref ref="ConsoleAppender"/>

    </root>

</log4j:configuration>

4.2.6 定義三種輸出方式,按照不同的級别,選擇不同的輸出方式.debug,info,級别通過System.out來列印。

WARN,FATAL通過System.err來輸出。ERROR,FATAL發送到郵箱。

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration>

      <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">

          <param name="Target" value="System.out" />

          <layout class="org.apache.log4j.PatternLayout">

               <param name="ConversionPattern" value="[%d{ISO8601}] %-5p %c %m %n" />

           </layout>

          <filter class="org.apache.log4j.varia.LevelRangeFilter">

               <param name="LevelMin" value="DEBUG"/>

               <param name="LevelMax" value="INFO"/>

          </filter>

      </appender>

      <appender name="STDERR"   class="org.apache.log4j.ConsoleAppender">

          <param name="Target" value="System.err" />

          <layout class="org.apache.log4j.PatternLayout">

               <param name="ConversionPattern" value="[%d{ISO8601}] %-5p %c %m %n" />

          </layout>

          <filter class="org.apache.log4j.varia.LevelRangeFilter">

               <param name="LevelMin" value="WARN"/>

              <param name="LevelMax" value="FATAL"/>

          </filter>

      </appender>

      <!--                           -->

      <!-- Declare the SMTPAppender -->

      <!--                           -->

      <appender name="EMAIL"   class="org.apache.log4j.net.SMTPAppender">

          <param name="BufferSize" value="512" />

          <param name="SMTPHost" value="mail.suiyuanwu.com" />

          <param name="From" value="[email protected]" />

          <param name="To" value="[email protected]" />

          <param name="Subject" value="[SMTPAppender] Application message" />

          <layout class="org.apache.log4j.PatternLayout">

               <param name="ConversionPattern" value="[%d{ISO8601}]%n%n%-5p%n%n%c%n%n%m%n%n" />

          </layout>

          <filter class="org.apache.log4j.varia.LevelRangeFilter">

               <param name="LevelMin" value="ERROR"/>

               <param name="LevelMax" value="FATAL"/>

          </filter>

      </appender>

      <!--                            -->

      <!-- setup log4j's root logger -->

      <!--                            -->

      <root>

          <level value="all" />

          <appender-ref ref="STDOUT"/>

          <appender-ref ref="STDERR"/>

          <appender-ref ref="EMAIL" />

      </root>

</log4j:configuration>

五、參考資料

1.http://www.vipan.com/htdocs/log4jhelp.html

          Don't Use System.out.println! Use Log4j - Vipan Singla

2.http://jakarta.apache.org/log4j/docs/manual.html

   Short introduction to log4j - Ceki Gülcü - March 2002

3.http://www-128.ibm.com/developerworks/cn/java/jw-log4j/

log4j提供了對日志記錄的控制

4.http://logging.apache.org/log4j/docs/documentation.html

log4j提供的文檔。