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

Javaで主にシステム開発をしながら思うところをツラツラを綴る

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:初期起動時と終了時の破棄に関して同じようなことを調べる可能性があると思っての抜粋