システム開発で思うところ

Javaで主にシステム開発をしながら思うところをツラツラを綴る。主に自分向けのメモ。EE関連の情報が少なく自分自身がそういう情報があったら良いなぁということで他の人の参考になれば幸い

Loggerファイルの初期生成と破棄

vermeer.hatenablog.jp

ちょっとだけ 忘れないようにしておきたいトピックがあったので そこだけの抜粋です。

アプリケーションを経由してログ出力をすると hoge.log.lckというファイルが残ってしまうので 能動的にCloseする必要があります。

参考としては こちらが詳しいです。

Java EE インジェクト可能なロガーの作り方と注意点 - Qiita

これで目的は十分達成できるのですが

  • DIを管理するクラスに直接ロジックを書くことを避けたかった
  • 開始・終了制御は CDIで完結させたかった

ということで、あれこれやりました。

差分コード

vermeer_etc / jsf-ddd / commit / 006cd7411230 — Bitbucket

抜粋するのは生成と破棄のところです。*1

@ApplicationScoped
public class LoggerLifecycleHandler {

    private static final Logger rootLogger = Logger.getLogger("root");

    public void startUp(@Observes @Initialized(ApplicationScoped.class) Object event) {
        System.out.println(">> Startup:Initialize RootLogger >>");
        LoggerInitializer.builder()
                .rootLogger(rootLogger)
                .propertiesFilePath("/logging.properties")
                .consoleHandlerClass(LogConsoleHandler.class, LogConsoleFormatter.class)
                .fileHandlerClass(LogFileHandler.class, LogFileFormatter.class)
                .execute();
    }

    public void shutdown(@Observes @Destroyed(ApplicationScoped.class) Object event) {
        System.out.println("<< Cleanup:Closing logging file <<");
        new LogFileCloser().close("root");
    }

}

@Observes @Destroyedは メソッドアノテーション@PreDestroyでも同じことが出来るのは確認したのですが、開始と終了との実装のバランスを鑑みてあわせました。

参考資料

Java EEアプリケーションで起動時になにかしらの処理をする方法 — 裏紙

java - CDI 1.1: Is @Observes @Initialized(TransactionScoped.class) supposed to work? - Stack Overflow

Loggerについての補足

Payaraで試しましたが、CosoleLogHandlerに何かしらフォーマットを適用しようとしたら、標準エラーログになってしまいます。
Loggerとして logger.infoとしてもエラーになります。
残念ながら、この解決方法は分かりませんでした。


*1:初期起動時と終了時の破棄に関して同じようなことを調べる可能性があると思っての抜粋