- PR -

ログファイルがどんどん作られちゃう

1
投稿者投稿内容
raimblue
会議室デビュー日: 2004/11/10
投稿数: 11
投稿日時: 2005-01-05 13:43
お世話になります。

ログ出力にjava.util.loggingを使用しようと考え、以下のようになコードを記述しました。

コード:


package com.hoge.Log;

import java.util.logging.Logger;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.SimpleFormatter;

public class LogInLog {

static LogInLog logInLog;
Logger logger = Logger.getLogger("test.log");

// コンストラクタ
private LogInLog() throws Exception {
try{
FileHandler fh = new FileHandler("d:/test%u.log",500,1,true);
fh.setFormatter(new SimpleFormatter());
logger.addHandler(fh);
logger.setLevel(Level.ALL);
} catch (Exception e){
e.printStackTrace();
}
}

// インスタンス取得 Singleton
public static LogInLog getInstance() throws Exception {
if ( logInLog == null ){
logInLog = new LogInLog();
}
return logInLog;
}

// ログの出力
public void log( String msg ){
try{
// ログ出力
logger.log(Level.INFO , msg);
} catch (Exception e) {
e.printStackTrace();
}
}

}




思ったようにログも出力されるのですが、JBOSSを再起動するたびにログファイルが作成されてしまいます。

test0.log
test1.log
test2.log
...

と、いったように。
さらにログの内容はtest2.logがtest1.logに、test1.logがtest0.logに含まれています。
これは logger.addHandler(fh); がおかしいという事なのでしょうか。。。

既にあるファイルに対してappendしていくようにしたいのですが、どのようにすればよいのでしょうか?
new FileHandler("d:/test%u.log",500,1,true);で4つ目の引数にtrueを指定しても思ったような形になりません。

JBOSSを再起動したとしてもtest0.log が500バイト未満のうちはtest0.logにappendしていってほしいのですが。。。

どなたかご教授いただけますでしょうか。よろしくお願いいたします。

<環境>
JDK1.4
JBOSS3.2.3
Windows2K


[ メッセージ編集済み 編集者: raimblue 編集日時 2005-01-05 13:44 ]
きよの
常連さん
会議室デビュー日: 2004/02/07
投稿数: 34
投稿日時: 2005-01-08 01:30
引用:

raimblueさんの書き込み (2005-01-05 13:43) より:

ログ出力にjava.util.loggingを使用しようと考え、以下のようになコードを記述しました。

コード:
            FileHandler fh = new FileHandler("d:/test%u.log",500,1,true);





%u を付けているからではないですか?
JavaDoc によると「"%u" 重複を解決する一意の番号」だそうですから、すでにファイルが存在する場合は重複しないように別のファイルが作成されてしまうのではないでしょうか?
たとえば、%u の代わりに %g を使えば良いと思います。
raimblue
会議室デビュー日: 2004/11/10
投稿数: 11
投稿日時: 2005-01-11 11:33
お世話になります。

>きよの様
%uを%gとしても同じでした(;_;)

もう少し悩んでみます。
ありがとうございました。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-01-13 11:56
動作だけ見ると、LogInLogのコンストラクタが何度も呼ばれているように見えますよね。
JBOSSということはAPサーバーですので、例えば以下のようなことが起こっているのかも
しれません。

1.java.util.logging.Loggerは、JBOSSのSystemClassLoaderからロードされる。
結果、ログ出力対象ファイルに用いられるLoggerインスタンスは、APサーバー全体
 に対して1個だけ。(Logger#getLogger()は、その唯一のインスタンスへの参照を
 返している)
2.com.hoge.Log.LogInLogは、デプロイした各アプリケーション毎のClassLoaderから
 それぞれロードされる。結果、LogInLogのstaticメンバ変数であるlogInLogイ
 ンスタンスは、APサーバー上ではアプリケーションごとに1個ずつ作成される。
3.結果、LogInLogのコンストラクタはAPサーバー全体を通して複数回コールされる。
 一つのファイルに対する出力を行うFileHandlerが複数登録されることになる。

デバッガやログなどを利用して、LogInLogの呼び出し状況を確認してみるとよいかも。

もし↑のような現象が原因ならば、回避策としては、
1.APサーバーが持っているであろう設定ファイルに、ロギング用の設定を記述するよう
 にし、FileHandlerをアプリケーション層で生成しないようにする。
2.デプロイしたアプリケーションごとに出力先ファイルを分ける。
といったことになるでしょうか。

[ メッセージ編集済み 編集者: シュン 編集日時 2005-01-13 17:37 ]
raimblue
会議室デビュー日: 2004/11/10
投稿数: 11
投稿日時: 2005-01-17 19:24
お世話になります。
返事が遅くなり申し訳ありません。

シュン様>
おおっ、APサーバー全体で1つのインスタンスのものがあるのですね!
うーんJBOSSをもっと勉強せねば・・・
APサーバー全体でのSingletonクラスのようなものでしょうか。

結論から言うと解決いたしました。
シュン様の仰る通り何度も何度も複数登録されてしまっているからのようです。
結局FileHandlerのClose処理を行うようにすれば解決しました。

また、最初の質問も少し間違っていて、JBOSSを再起動ではなくアプリをデプロイし直す度に
ログファイルが増加していました。
Closeを行わないでデプロイをするとFileHandlerのプロセスが握られたままで新たに
デプロイしたアプリで実行すると増えていくようでした。
ご迷惑おかけしました。

皆様ありがとうございました。
1

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