Log4jで月単位のローリングにバグ?
DailyRollingFileAppenderで月ごとにファイルローリングをした時に挙動がおかしい事に気づきました。正しく月ごとにファイルがローリングされません。
例えばログ出力を[2004/11/24 16:48:30]に開始したとしましょう。そうすると次のローリング開始日時が[2004/12/1 00:48:00]に設定されます。つまり、[2004/12/1 00:00:00]から出力されたログは、新しいファイルへ書き込まれなければいけないのに、[2004/12/1 00:48:00]以降にならないとファイルが切り替わらないという事です。
初めてログ出力した時刻の「分」がそのまま次のローリングの時刻に引き継がれてしまっています。これはDailyRollingFileAppenderクラスの中に定義してある、RollingCalenderクラス、getNextCheckDateメソッドのバグです。420行目付近から始まる下記の赤い部分が抜けています。
case DailyRollingFileAppender.TOP_OF_MONTH: this.set(Calendar.DATE, 1); this.set(Calendar.HOUR_OF_DAY, 0); this.set(Calendar.MINUTE, 0); this.set(Calendar.SECOND, 0); this.set(Calendar.MILLISECOND, 0); this.add(Calendar.MONTH, 1); break;
そういうもんなのかなぁと思っていましたけど、やはり挙動的に困るので、直してみました。ちなみにこのバグは「週単位のローリング」を設定しても起こります。なぜ分、時、日、午前・午後などのローリングは分を00分に設定しているのに、週と月のローリングだけ分の値を00分にしていないのかは謎です。