1

Railsアプリケーション、Sidekiq、およびスケジューリング用のクロックワークmodを備えた実行環境があります。

私は logger.debug と logger.info の命令で満たされた多くの異なるワーカーを持っており、何が起こっているのかを知るために、それらのいくつかでデバッグ ログをアクティブにする必要がある場合があります。私はSidekiqロガーが好きで、仕事をするためにワーカーで「logger.debug」命令が必要なだけなので、それを利用したいと思っています.

現在のセットアップで見逃しているのは、一部のワーカーの DEBUG レベルを有効にし、他のワーカーを標準の INFO のままにしておく可能性です。

今、私の各ワーカーには、次の初期化メソッドがあります。

class SendMailOnStart

   include Sidekiq::Worker
   sidekiq_options :retry => false, :queue => :critical

    def initialize
      logger.level = Logger::INFO
    end

    .... ...

ただし、1 つのワーカーのレベルを変更すると、このレベルは次のワーカーで指定されたレベルで上書きされます。たとえば、2 つのワーカーが一緒に処理された場合、2 番目のワーカーが「優先」されます。

これをエレガントな方法で達成する最良の方法は何ですか?

Javaの世界から来て、カスタムロガーを作成して各ワーカーに配置し、Sidekiqロガーで使用される出力形式をコピーし、各ワーカーにロガーメソッドを追加することしか考えられません

def logger
  logger = MyLogger.new
end

初期化メソッドで必要なときにレベルを変更する

これはRubyでの最良のアプローチですか?

4

2 に答える 2

0

それが最善のアプローチかどうかはわかりませんが、次のことを行います。まず、呼び出し元のファイル名やメソッドを取得する関数を準備しましょう。

  def parse_caller
    # magic number 7 below is the amount of calls 
    #   on stack to unwind to get your caller
    if /^(?<file>.+?):(?<line>\d+)(?::in `(?<method>.*)')?/ =~ caller(7).first
      file      = Regexp.last_match[:file]
      line      = Regexp.last_match[:line].to_i
      method    = Regexp.last_match[:method]
      [file, line, method]
    end
  end

次に、インスタンスのデフォルトのフォーマッタをオーバーライドしLoggerて、呼び出し元をチェックするように強制します。

  logger.formatter = lambda do |severity, datetime, progname, msg|
    f,l,m = parse_caller
    # HERE GOES YOUR CHECK
    if f =~ /…/
      …
    end
  end

奇妙なハックに見えることはわかっていますが、私にとってはうまく機能します。

于 2013-02-03T17:01:37.933 に答える