2011-05-13 23 views
0

私は小さなJava EEアプリケーションのログインにjava util loggingを使用しています。 FileHandler(エラー/警告など)を追加するために、私は実際のロガーを作成するLoggerFactoryを作成し、ファイルハンドラーを静的に「メイン」ロガーに追加します。JULのFileHandlerを閉じる必要がありますか?

package de.il.myapp.logging; 

public class LoggerFactory { 

    private static final java.util.logging.Logger MAIN_LOGGER = java.util.logging.Logger.getLogger("de.il.myapp"); 

    static { 
      try { 
       final java.util.logging.FileHandler fh = new java.util.logging.FileHandler("error.log", 1024*1024, 5, true); 
       fh.setLevel(Level.WARNING); 

       final java.util.logging.Formatter formatterTxt = new java.util.logging.SimpleFormatter(); 
       fh.setFormatter(formatterTxt); 
       MAIN_LOGGER.addHandler(fh); 

      } catch (final IOException e) { 
       //... 
      } 
     } 
    } 

    public static final Logger getLogger(final Class<?> clazz){ 
     return java.util.logging.Logger.getLogger(clazz); 
    } 
} 

アプリケーションを停止すると、lckファイルはまだ残りますが、すべて正常に動作します。最初は新しいlckが作成されます。だからいくつかの再起動後、ディレクトリはこのようになります。

error.log.0 
    error.log.0.1 
    error.log.0.1.lck 
    error.log.0.2 
    error.log.0.2.lck 
    error.log.0.3 
    error.log.0.3.lck 
    error.log.0.lck 

質問:どうすればこの問題を回避できますか?最後にファイルハンドラを閉じる必要がありますか?しかしここで?これはJava EEアプリケーションなので、私はあなたの出口ポイントではありませんか?そして、なぜ..log.0.Xだけでなく、ログファイルも..log.0.Xになるのですか?

おかげで、あなたはEJBの中でjava.ioクラスを使用することが許可されていないすべての インゴ

答えて

0

Glassfishでは、Lifecycle Listenersを使用できます。 JBossでは、StartupServiceMBeanを使用できます。どのアプリケーションサーバーを使用していますか?

+0

私はWebsphere Application Server 7(コミュニティ版ではありません)を使用しています。このアプリケーションサーバーの名前も知っていますか? /私はServletContextListener経由でそれを処理できますか? – Ingo

+0

これはWebアプリケーションかJEEアプリケーションですか?言い換えれば、サーブレット、JSPなどの内部でのみロガーを使用しているのですか、EJB内でも使用していますか? EJBを使用していない場合は、 'ServletContextListener'を使用できます。それ以外の場合は動作しません。 – Behrang

+0

現在、私はMDBのみを持ち、サーブレットはありません。言い換えればJEEアプリケーションです。私はEJBでLoggerを使用しています。 – Ingo

0

まず:スペックの

21.2.2項:

エンタープライズBeanが使用することはできませんファイル のファイルに ファイルとディレクトリをアクセスしようとすると、パッケージは になります。

つまり、java.ioクラスを使用するクラスは、コンテナに質問しない限り、使用しないでください。

しかし、あなたが熱心にロードされたシングルトンセッションBeanを作成し、@PreDestroy上でクリーンアップを実行する場合:

@Startup 
@Singleton 
public class FileHandlerCloser { 

@PreDestroy 
public void closeFileHandlers() { 
    // close file handlers 
} 

} 

スペックはこれについて非常に明確ではありませんが、私はシングルトンBeanは、他のすべての豆後に破壊されていると思います。

関連する問題