11

Sidekiq 2.12 を使用してバックグラウンド ジョブを実行する Rails 3.2 ベースのアプリがあります。Sidekiq ジョブは、インタラクティブな Rails アプリと同じメソッドを呼び出すことができます。Sidekiq から呼び出されたときに Sidekiq ログにログを記録し、Rails から呼び出されたときに Rails ログにログを記録するメソッドが必要です。これを行うためのクリーンな方法を探していますが、これまでのところ空になっています。

どちらの環境でも、Sidekiq::Logging.loggerとの両方Rails.loggerが定義され、動作します。

  • 適切なロガーを選択するために、ロギングの試行ごとにコール スタックを調べたくありません。
  • Sidekiq と Rails の両方から呼び出される可能性のあるすべての関数に、関数パラメーターとしてログ オブジェクトを渡したくありません。

おそらく正しいことは、起動プロセス中にSidekiqにRailsロガーをそのロガーに置き換えてから、常にRailsロガーにログを記録させることだと思いますが、Railsロガーがセットアップされた後に実行される初期化フックが見つかりませんただし、Sidekiq ジョブが開始される前であり、Sidekiq によってのみ実行されます。

そのようなフックはありますか?もしそうなら、それについて教えてください。そうでない場合は、Sidekiq と Rails の実行環境に基づいてログ出力をきれいにリダイレクトする方法について、他の提案を提供してください。

4

1 に答える 1

31

Sidekiq と Rails はどちらもLogger、Ruby StdLib の準拠クラスを使用します。

Sidekiq サーバー構成ブロックで Sidekiq ロガーを使用するように Rails ロガーを再構成できるはずです。次のようなファイルを検索/作成しますconfig/inititializers/sidekiq.rb

Sidekiq.configure_server do |config|
  Rails.logger = Sidekiq::Logging.logger

  # Sidekiq other server config
  ...
end

Sidekiq.configure_server 呼び出しに渡されたブロックは、Sidekiq バックエンドのサーバー コンポーネント内でのみ実行され、Rails アプリ サーバーまたはコンソールで実行されているクライアント内では実行されません。

于 2013-08-08T16:21:49.260 に答える