2007/02/04

[Java]log4j - RollingFileAppender counts String.length()

jakarta log4jのRollingFileAppenderはファイルサイズでローリングする と説明されることが多いが、本当は出力した文字数を数えている。
Asciiしか使わないようなログなら問題ないんだけど、日本語を出力していると設定したサイズより大きくなる。メッセージ自体は英語にしていても、外部からの入力パラメータなんかを埋め込んでいるとそうはいかなくなってしまう。
カウントしているのはhelperパッケージにあるCountingQuietCounter#write(String)なので、コレを入れ替えることになる。
まず、CountingQuietCounter#writeメソッドをオーバーライドして、カウントの仕方を変更したQuietCounterを作成する。もとのコードを参考にして、下記の通り修正。
count += string.length();count += string.getBytes().length;
getBytes()は、出力文字コードに手を入れているならそのコードを指定できるようにしておく。

次に、CountingQuietCounterを生成している箇所を修正。これはRollingFileAppender#setQWForFiles(Writer writer)を同じくオーバーライドして、自作のCountingWriterに置き換えよう。
あとは、設定ファイルに指定するAppenderを自作Appenderに直して完了。

因みに、バイト変換するコストが発生するので注意。Log4jはWriterベースで作られているので、OutputStreamベースに作り変えるのはもう少し作業が必要になる。

ラベル: ,

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム