java.util.logging使えね

セゾンデュポン

実行状況を表示してるのをファイルにも書いてとか、プロパティで出力の有無を切り替えれるようにしてとか言われて、ログAPIを使おうと思って、とりあえず標準のjava.util.logging使おうと思ったんだけど、設定がインストールしたJDK全体に及ぶとか、使えなすぎて涙ちょちょぎれ。
みんながjava.util.logging使えないって言ってるのがわかった。どうせマニアックな使い方しようとしてるんじゃねぇの?とか思っててごめんなさい。普通の使い方でも無理ですコレ。


Commons Loggingがすでに依存ライブラリとして使われてるのでそれ使おうかと思ったけど、実装がLog4J一択な感じで、実装を切り替えれるメリットも感じないので、Log4Jを直で使うことにしました。

Log4Jの落とし穴

ということで、Log4Jを使おうと思ってlog4j.jarをクラスパスに含めたら、今までおとなしかったライブラリがモノを言い始めた。
まずはBeanUtils。でも、これはloggerがねぇよ!って言ってるだけだったので、log4j.properties的なファイルにこんなのを追加すればよろしい。

log4j.appender.null = org.apache.log4j.varia.NullAppender
log4j.logger.org.apache.commons.beanutils.BeanUtils=INFO, null


問題はVelocityで、これはログファイルを作ってくれやがるので、邪魔。いちライブラリの分際で勝手にファイル作るなと。しかも、デフォルトでログレベルFINEってどうよ。
で、なんかググってみつける情報は古くてVelocityEngineとか使ってあるし、typoでハマったりするし、さんざん。
とりあえず、Velocityのログ出力を殺すならこれ。

Velocity.addProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
        NullLogChute.class.getName());


自前のlog4j.properties的ファイルで設定できるようにするならこれ。

Velocity.addProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
        Log4JLogChute.class.getName());
Velocity.addProperty(Log4JLogChute.RUNTIME_LOG_LOG4J_LOGGER, "velocity");


そうするとlog4j.properties的なファイルにこんな感じで書けばいいようになる。

log4j.appender.null = org.apache.log4j.varia.NullAppender
log4j.logger.velocity=INFO, null