Loggerファイルの初期生成と破棄
ちょっとだけ 忘れないようにしておきたいトピックがあったので そこだけの抜粋です。
アプリケーションを経由してログ出力をすると 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アプリケーションで起動時になにかしらの処理をする方法 — 裏紙
Loggerについての補足
Payaraで試しましたが、CosoleLogHandlerに何かしらフォーマットを適用しようとしたら、標準エラーログになってしまいます。
Loggerとして logger.info
としてもエラーになります。
残念ながら、この解決方法は分かりませんでした。
*1:初期起動時と終了時の破棄に関して同じようなことを調べる可能性があると思っての抜粋