日誌系統是作爲服務器端程序的一個很重要的部分。
使用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。