20 7月 2009

logback 二、三事

(1)要用Logback當然就一併用slf4j,Maven2的dependencies就加入:

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>0.9.16</version>
	<type>jar</type>
</dependency>
<!-- 用以取代commons-logging -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>1.5.8</version>
	<type>jar</type>
</dependency>
<!-- 用以取代Log4j,若確定系統中都是透過commons-logging並未直接
呼叫log4j的話可以不用加此設定-->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>log4j-over-slf4j</artifactId>
	<version>1.5.8</version>
	<type>jar</type>
</dependency>

(2)logback-test.xml 與 logback.xml
Logback預設會先找classpath下是否有logback-test.xml,若沒有的話再找logback.xml,若都沒有就用預設的configuration.
所以如果是採用Maven預設的Source Code Structure的話,只要在src/test/resources/下放一個test專用的logback-test.xml就可以專門記錄test產生log.而不需要特別再去改正常系統的logback.xml.

(3)debug mode與automatically reloading
Logback有個機制可以檢視系統載入的logback configuration,還可以定時確認logback.xml是否有被改變而重新載入改變後的設定

<configuration debug="true" scan="true" scanPeriod="30 seconds">
</configuration>
其中debug="true"就是開啟debug mode,會列出目前載入設定檔的名稱,裡面的logger,appender也會列出來。
而scan="true"就是啟用automatically reloading,scanPeriod則可以設定每隔多久檢查是否有更改而載入的時間。

(4)可以設定變數
1. 直接指定Properties name and value.

<property name="USER_HOME" value="/home/elliot" />
2. 利用file指定properties file location
<property file="src/main/resources/system.properties" />
3. 使用resource在classpath中找properties file
<property resource="system.properties" />
就可以在logback.xml中使用${USER_HOME}來控制Log

(5)RollingFileAppender supports automatic file compression。
只要用FixedWindowRollingPolicy或TimeBasedRollingPolicy就可以自動壓縮。

<FileNamePattern>${namepattern}.log.zip/.gz</FileNamePattern>
在FileNamePattern內最後加上.zip就會用zip壓縮,而加入gz即會使用gzip壓縮log.

(6)有趣的Filter
1. 可以利用LevelFilter只接收單一種類Level的Log

<filter class="ch.qos.logback.classic.filter.LevelFilter">
	<level>ERROR</level>
	<onMatch>ACCEPT</onMatch>
	<onMismatch>DENY</onMismatch>
</filter>
這個Filter相當方便,有時在DEBUG時只希望看ERROR的部份,這個Filter可以讓我專注於ERROR的資料。
2. 利用EvaluatorFilter接收含有特別意義的Log
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
	<evaluator name="myEval">
		<expression>message.contains("billing")</expression>
	</evaluator>
	<OnMismatch>NEUTRAL</OnMismatch>
	<OnMatch>DENY</OnMatch>
</filter>
這個Filter也相當有用,當我希望取得具有特定字串或Exception的Log時,這個Filter能很方便的取得需要的資料。

沒有留言: