Log4j日誌文件系統配置,從零到有

日誌系統是作爲服務器端程序的一個很重要的部分。

使用Java開發的服務端程序,一般都使用Log4j這個日誌文件系統,今天花了一天的時間來研究這個玩意兒,總算勉強搞出了一個能用的原型來了。

一、首先,需要在工程中引入下面幾個包。剛開始我只引入了1, 3, 4三個包,一直打不出日誌,不管怎麼改xml配置文件都是,頭都搞大了,後面查了很多博文,才發現還需要另外2個。

1.commons-logging-1.1.1.jar

2.jcl-over-slf4j-1.7.5.jar

3.log4j-1.2.16.jar

4.slf4j-api-1.7.5.jar

5.slf4j-log4j12-1.7.5.jar  <---類似一個做橋接的作用,將slf4j 和log4j聯繫起來。在代碼中我是用的slf4j的logger 和 slf4j的LoggerFactory.getLogger()。剛開始日誌一直無法打到文件中,搞了好久,後來在一篇博文中看到,原來slf4j和log4j之間還需要一個橋接的。

這些都可以在maven的search中找到。


二、然後自己要在工程中寫一個類,來加載和監控 log4j的配置文件。

有兩個類:org.apache.log4j.xml.DOMConfigurator  <---- 監控xml格式的配置文件

               org.apache.log4j.PropertyConfigurator     <------監控 properties格式的配置文件。

我在工程中用的是xml格式的配置文件,所以就看這個文件。


由於是servlet的web應用,所以我在servlet中來完成這個加載工作

先寫一個servlet, 在init()中完成配置文件的加載工作。

public class Log4jInitServlet extends HttpServlet

{

    public void init()

   {

     DOMConfigurator.configureAndWatch(configure_file_path,  watch_interval);  // 參數分別是配置文件的路徑和動態監控配置文件改變的時間間隔。

   }

   public void doGet()

  {     // do nothing

  }

}


三、然後在servlet的web.xml中加上這個servlet,並且設置爲啓動時加載。當然,你也可以在工程代碼的其他地方來加載,但是要保證在log工作的時候配置文件已經加載了。

<servlet>
    <servlet-name>log4j-init</servlet-name>
    <servlet-class>Log4jInitServlet </servlet-class>            
    <load-on-startup>1</load-on-startup>        
  </servlet>

這樣jetty啓動的時候,就會執行這個servlet,去加載log4j的配置文件了。


四、接下來寫xml的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

    <!-- ========================== 自定義輸出格式說明================================ -->
      <!-- %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL -->
      <!-- %r 輸出自應用啓動到輸出該log信息耗費的毫秒數  -->
      <!-- %c 輸出所屬的類目,通常就是所在類的全名 -->
      <!-- %t 輸出產生該日誌事件的線程名 -->
      <!-- %n 輸出一個回車換行符,Windows平臺爲“/r/n”,Unix平臺爲“/n” -->
      <!-- %d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18>日 22:10:28,921  -->
      <!-- %l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)  -->

<!--詳細的格式可以參考這裏-->
      <!-- ========================================================================== -->


      <!-- ========================== 輸出方式說明================================ -->
      <!-- Log4j提供的appender有以下幾種:  -->
      <!-- org.apache.log4j.ConsoleAppender(控制檯),  -->
      <!-- org.apache.log4j.FileAppender(文件),  -->
      <!-- org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件), -->
      <!-- org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),  -->
      <!-- org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)   -->
  <!-- ========================================================================== -->

  <!-- 輸出到日誌文件  -->
    <appender name="FileDepender" class="org.apache.log4j.RollingFileAppender">            <--------- 定義一個appender後面的日誌具體調用它
       <param name="File" value="/home/xxx/jetty/logs/xxx.log"/>                   <--------------------   下面這些參數都可以見名知意
       <param name="Append" value="true"/>
       <param name="MaxFileSize" value="10MB"/>
       <param name="MaxBackupIndex" value="10"/>
       <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" value="[%t] %d{yyyy-mm-dd,hh:mm:ss.SSS} %l [%p]  %m%n"/>
       </layout>
   
<!--       <filter class="org.apache.log4j.varia.LevelRangeFilter">  
           <param name="LevelMin" value="INFO"/>

           <param name="LevelMax" value="ERROR"/>  
       </filter>  -->
    </appender>

    <!--通過<category></category>的定義可以將各個包中的類日誌輸出到不同的日誌文件中-->
  <!--  <category name="com.packagename">  
       <priority value="debug" />  
       <appender-ref ref="FileDepender" />  
     </category>  
    -->

    <root>
       <priority value="debug"/>
       <appender-ref ref="FileDepender"/>     <----------------   指向前面定義的appender,前面可以定義多個appender,這裏也可以引用多個appender
    </root>
</log4j:configuration>


接着將項目打包,部署到環境上,運行起來後就會自動在指定的位置生成日誌文件了。


For more details, see http://www.linuxso.com/architecture/26604.html



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章