0

小さなJavaEEアプリケーションにログインするためにjavautilloggingを使用しています。追加のFileHandlerを追加するために(たとえば、エラー/警告のために)、実際のロガーを作成し、ファイルハンドラーを「メイン」ロガーに静的に追加するLoggerFactoryを作成しました。

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

問題は、どうすればこれを回避できるかということです。最後にファイルハンドラーを閉じる必要がありますか?しかしここで?これはJavaEEアプリケーションなので、出口点ではありませんか?また、.. log.0だけでなく、ログファイルに対して..log.0.Xを取得するのはなぜですか?

ありがとう、インゴ

4

2 に答える 2

0

まず第一にjava.io、EJB でクラスを使用することは許可されていません。

仕様のセクション 21.2.2:

エンタープライズ Bean は、java.io パッケージを使用して、ファイル システム内のファイルおよびディレクトリにアクセスしようとしてはなりません。

これはjava.io、コンテナに要求してクラスを取得しない限り、クラスを使用するクラスも使用すべきではないことを意味します。

ただし、熱心にロードされたシングルトン セッション Bean を作成し、クリーンアップを実行すると、次のようになり@PreDestroyます。

@Startup 
@Singleton 
public class FileHandlerCloser {

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

}

これについての仕様はあまり明確ではありませんが、シングルトン Bean は他のすべての Bean の後に破棄されると思います。

于 2011-05-15T15:52:00.447 に答える
0

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

于 2011-05-15T16:02:48.003 に答える