😺

【Java】ShutdownHookを実装してるアプリのLoggerをlog4j2に変えたら死ぬ程はまった話

2022/04/20に公開

結論

<configuration ... shutdownHook="disable"> を忘れず設定しよう!!

エピソード

ものすごく昔に作ったJavaのデーモンアプリを新しい環境に乗せ替え用としてOSはもちろんJDKや各種ライブラリを最新化した時の話です。

このアプリ、SIGNALを使って終了させる仕組みでShutdownHookを使って実行中タスクの待機やら片付けやらをしていたのですが、その辺のログが丸っと出ていないことに動作確認をして気づきました。

JDKのバージョンを上げすぎたのかと思って色んなバージョンのJDKを試してみたり、色んな種類のSIGNALを投げてみたり、どこまで処理が生きてるのがFileに書き込んで確認してみたりと、とにかく色々やってみたけどなーんにも解決の糸口が見つからなくてかなり焦りました。

で、ようやく見つけたのがlog4j2にはデフォルト非同期処理で動作していて、SIGNALで終了させると最後まで書き込まれないという記事。(多分あってる。)
じゃあ、それを同期に変えたりすればいいのかと思って調べてみたら、shutdownHook実装してるならlog4j2の設定はoffにしようという記事を発見。
試してみたら無事解決できました。
いやー、解決できてほんとよかった。

参考

やはりstackoverflow‥‥!! stackoverflowは全てを解決する‥‥!!
マジ感謝。
https://stackoverflow.com/questions/30336669/how-to-flush-asynchronous-loggers-in-log4j2-with-disruptor

https://stackoverflow.com/questions/17400136/how-to-log-within-shutdown-hooks-with-log4j2

Discussion