LoginSignup
0
1

More than 5 years have passed since last update.

Sidekiq のログを標準出力に出したまま USR2 シグナルで他のログの再オープンをする方法

Last updated at Posted at 2017-09-02

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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1