- PR -

Javaプログラムでのログ参照中(log4j)にローテーション&RENAME処理

1
投稿者投稿内容
会議室デビュー日: 2006/09/21
投稿数: 1
投稿日時: 2006-09-21 09:44
初めまして、Kと申します。
現在のかかえている問題について自分の力ではどうすることもできず、初めて投稿します。
どうぞ宜しくお願い致します。

Weblogic8.1.4、FTServer2003にて現在開発を行っております。
サーバー内の任意のディレクトリにlog4jを使用して通信ログを落としています。
ログは、10MBごとにローテーション&RENAME処理が実行され20個保存するよう設定してます。

この通信ログをクライアント端末よりJavaプログラムにて、参照し画面に出力する際問題が発生します。
問題というのは、JavaプログラムからBufferedReaderでread中にこのローテーション処理が実行されてしまうと、参照中のファイルより新しいファイルについて更新されないという現象が発生します。
最新ログファイルは更新される為、ローテーション前に最新ログだった内容が消えてしまいます。

 -例----------------------------------------------------------------------------------
 ローテーション前
 log,  log1,    log2,    log3,  【参照中 log4】, log5,  log6,     log7・・・
 
 ローテーション&RENAME処理実行
 log,  log1[無更], log2[無更], log3[無更], log4[無更], 名抜け log6[前log5], log7[前log6] ・・・
    ↑
   内容抜け
 -------------------------------------------------------------------------------------
 log.4を参照していた場合
 ・ローテーション後に番号が抜ける: log.5
 ・ローテーション後に内容が抜ける: ローテーション前にlogだった内容
 
 ファイルの参照方法としましては、検索期間を指定しファイル更新日時よりファイル選択し、
  @ファイルオープン
  Aファイル内容をバッファに保存
  Bファイルをクローズ
  C次のファイルへ
 という流れになります。
 選択ファイルは必ずしも1つではなく、検索期間によっては複数になります。
 ファイルは1つずつオープン&クローズしていきますが、検索期間が長くなるほどローテーション処理と重なる高く率が増えてしまいます。

この現象を回避する為に何か良い方法はありませんでしょうか?
Javaプログラムにて参照中でもローテーション処理を正常に実行できるというのが理想です。

以下、対策として試したものです。
・ファイルをReadOnlyに設定してしまうと、ファイル自体RENAMEできなくなってしまいました。
・ファイルを別ディレクトリにコピーし、参照
 この方法でも結果的にはコピー中にローテーション処理を実行されると同じ現象となります。


どんなことでも構いません、アドバイスをお待ちしておりますのでどうぞ宜しくお願い致します。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-09-21 12:28
1.ローテーションさせずにファイル出力させる
 運用との兼ね合いもあるから、簡単に変更することはできないかも・・・

2.ローテーションして出力するアペンダーとは別に、もう一つローテーション
せずログファイルを出力するファイルアペンダーを定義して、そちら側の
ファイルをクライアントで参照する。多少効率悪くても良ければ、syslogと
かDBに出力させる方法なんかもありかもしれません。


[ メッセージ編集済み 編集者: 小僧 編集日時 2006-09-21 12:30 ]
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-09-21 23:21
小僧さんと重複しますがサイズのローテーションでなく
log4jで日付や時間単位でログファイルを出力するようにすればよいのでは
検索条件の日時にたいしてファイルの特定がしやすいですし
オープン中にリネームが行われません

Weblogicの環境で実現不可なら上記忘れてください
DISK容量に余裕がないというのならメッセージの大量発生を考慮する必要があります





[ メッセージ編集済み 編集者: 99ri 編集日時 2006-09-22 00:13 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-09-22 00:21
ローテーションを行うアペンダーを継承して、
書き込み処理前にjava.nio.channels.FileLockを取得してから書き込むように
拡張してあげるといいかなと思います。

ロックの影響やコストも考えると、非同期でログの書き出しができる
AsyncAppenderでラップしてあげると、いい感じじゃないかなと思います。
1

スキルアップ/キャリアアップ(JOB@IT)