「Tomcat」java.util.logging.Filter を使って Tomcat のログ出力を制御する

java.util.logging.Filter を使って Tomcat のログ出力を制御してみました。ちょっとはまったので、メモ残しておきます。

・Filter (Java Platform SE 7 )
http://docs.oracle.com/javase/7/docs/api/java/util/logging/Filter.html

今回やってみたのは、Tomcat 停止時に catalina.out に以下のような出力がありますが、以下の "ajp-bio-8009" を含むメッセージを出力しない、ということです。

Tomcat 停止時の catalina.out の出力

7 15, 2014 1:23:40 午前 org.apache.catalina.core.StandardServer await
情報: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
7 15, 2014 1:23:40 午前 org.apache.coyote.AbstractProtocol pause
情報: Pausing ProtocolHandler ["http-bio-8080"]
7 15, 2014 1:23:40 午前 org.apache.coyote.AbstractProtocol pause
情報: Pausing ProtocolHandler ["ajp-bio-8009"]
7 15, 2014 1:23:40 午前 org.apache.catalina.core.StandardService stopInternal
情報: サービス Catalina を停止します
7 15, 2014 1:23:40 午前 org.apache.coyote.AbstractProtocol stop
情報: Stopping ProtocolHandler ["http-bio-8080"]
7 15, 2014 1:23:40 午前 org.apache.coyote.AbstractProtocol stop
情報: Stopping ProtocolHandler ["ajp-bio-8009"]
7 15, 2014 1:23:40 午前 org.apache.coyote.AbstractProtocol destroy
情報: Destroying ProtocolHandler ["http-bio-8080"]
7 15, 2014 1:23:40 午前 org.apache.coyote.AbstractProtocol destroy
情報: Destroying ProtocolHandler ["ajp-bio-8009"]


1. Filter インタフェースの実装クラスを作成する。

■ MyFilter.java

package test.filter;

import java.util.logging.Filter;
import java.util.logging.LogRecord;

public class MyFilter implements Filter {

	@Override
	 public boolean isLoggable(LogRecord record) {
	 String message = record.getMessage();
	 if (message.contains("ajp-bio-8009")) {
	 return false;
	 }
	 return true;
	}
}

上記を .jar ファイル ( FilterTest.jar ) にして $CATALINA_HOME/bin/ に配置する。

javac test/filter/MyFilter.java
jar cvf FilterTest.jar test


2. CLASSPATH に上記 .jar ファイルを追加する

いろいろやり方あると思いますが、今回は catalina.sh の以下で追加しました。
※ これがわからなくてかなり時間かかりました。最初 $CATALINA_HOME/lib とかにおいてて全く動かずで。また filter プロパティは存在しないクラス指定してもエラーとかでないので、これまた厄介だった・・・はまった理由はクラスローダとかその辺りの理解が足りないんですかね。

- 略 -
132 # Ensure that any user defined CLASSPATH variables are not used on startup,
133 # but allow them to be specified in setenv.sh, in rare case when it is needed.
134 CLASSPATH=/usr/local/tomcat/apache-tomcat-7.0.41/bin/FilterTest.jar  # <- ( 追記 )
- 略 -


3. logging.properties に filter プロパティを追記

- 略 -
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.filter = test.filter.MyFilter # <- ( 追記 )
- 略 -


上記で Tomcat 起動/停止すると、停止時の catalina.out の出力は以下のようになる。ちゃんと "ajp-bio-8009" 含むメッセージの出力が回避できてますね。

7 15, 2014 1:39:25 午前 org.apache.catalina.core.StandardServer await
情報: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
7 15, 2014 1:39:25 午前 org.apache.coyote.AbstractProtocol pause
情報: Pausing ProtocolHandler ["http-bio-8080"]
7 15, 2014 1:39:25 午前 org.apache.catalina.core.StandardService stopInternal
情報: サービス Catalina を停止します
7 15, 2014 1:39:25 午前 org.apache.coyote.AbstractProtocol stop
情報: Stopping ProtocolHandler ["http-bio-8080"]
7 15, 2014 1:39:25 午前 org.apache.coyote.AbstractProtocol destroy
情報: Destroying ProtocolHandler ["http-bio-8080"]

以上でした。

[ 環境情報 ]
CentOS 6.2
Apache Tomcat 7.0.41
Java SE 7 Update 51