Sidekiq の特定のユースケースでちょっと困ったことがあったのでその対処法。特定のユースケースとは:
- Sidekiq 標準ログとは別のログをファイルに書き込んでおり logrotate などで定期的にローテートしたい時、かつ
- 標準のログはファイルではなく標準出力に出したい時
- 要は Docker コンテナのログとして見たい時
である。
何が問題か
Sidekiq では、標準ログを書いているファイルを logrotate などでローテートした時には、USR2 シグナルを送ると標準ログのファイルを含めて append しているいろんなファイルを必要に応じて再オープンしてくれる。
しかし、これは標準ログをファイルに書いている時だけに起こる挙動であり、標準出力に出してる時は USR2 シグナルは何の影響も及ぼさない: Code。そして、require
オプションで渡すブート時のユーザコード (Rails の場合は config/application.rb
) を読み込んだ後に Sidekiq がシグナルを trap しているので、簡単に USR2 のシグナルだけを trap してどうのこうのできない。
解決策
とりあえず雑に prepend で解決した。
# require オプションで読み込まれるファイル
module MySignalHandler
def handle_signal(sig)
if sig == 'USR2'
Sidekiq.logger.info "Received USR2, reopening log file"
Sidekiq::Logging.reopen_logs
else
super
end
end
end
module Sidekiq
class CLI
prepend MySignalHandler
end
end