web-dev-qa-db-ja.com

ログに記録する遅延ジョブの取得

#Here is how I have delayed job set up.

Delayed::Worker.backend = :active_record
#Delayed::Worker.logger = Rails.logger
Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/
##{Rails.env}_delayed_jobs.log", Rails.logger.level)
Delayed::Worker.logger.auto_flushing = 1
class Delayed::Job
    def logger
        Delayed::Worker.logger
    end
end
if JobsCommon::check_job_exists("PeriodicJob").blank?
    Delayed::Job.enqueue PeriodicJob.new(), 0, 30.seconds.from_now
end
#end


#Here is my simple job.

class PeriodicJob
    def perform
        Rails.logger.info "Periodic job writing #{Time.now}"
            Delayed::Job.enqueue PeriodicJob.new(), 0,
30.seconds.from_now
    end
end

Railsログまたは遅延ジョブログファイルに遅延ジョブからのログメッセージが表示されません。表示されるメッセージは、delayed_jobs.logファイルのジョブ開始/成功/失敗のみです。

これは、ワーカーのバグやメモリリークの検出など、大きな問題を引き起こしています。助けてください!

22
badnaam

Rails.logger自体をハッキングして別のログファイル(delayed_jobエントリに必要なもの)を使用し、また設定することで、Rails 3/Delayed Job 2.0.3まったく同じオブジェクトを使用するための遅延ジョブロガー:

file_handle = File.open("log/#{Rails.env}_delayed_jobs.log", (File::WRONLY | File::APPEND | File::CREAT))
# Be paranoid about syncing, part #1
file_handle.sync = true
# Be paranoid about syncing, part #2
Rails.logger.auto_flushing = true
# Hack the existing Rails.logger object to use our new file handle
Rails.logger.instance_variable_set :@log, file_handle
# Calls to Rails.logger go to the same object as Delayed::Worker.logger
Delayed::Worker.logger = Rails.logger

上記のコードが機能しない場合は、Rails.loggerRails_DEFAULT_LOGGERに置き換えてみてください。

8
Seamus Abshere

これは簡単な回避策かもしれませんが、私にとっては十分に機能します。

system("echo #{your message here} >> logfile.log")

シンプルだが機能する

6
Itay k

イニシャライザで次の設定で動作しています。


require 'delayed/worker'

Delayed::Worker.logger = Rails.logger

module Delayed
  class Worker
    def say_with_flushing(text, level = Logger::INFO)
      if logger
        say_without_flushing(text, level)
        logger.flush
      end
    end
    alias_method_chain :say, :flushing
  end
end

4
Roman

私は単にこれをしました:

/config/environments/development.rb

MyApp::Application.configure do

 [...]


 [...]


 [...]

 Delayed::Worker.logger = Rails.logger

end

次のリクエストごとに、メールがログに表示されます。

[〜#〜] note [〜#〜]:ログに記録されているメールにページを更新する必要がある場合があります。サーバーを再起動することを忘れないでください;)

4
workdreamer

何か問題がある場合、DelayedJobは出力されないようです。

1-非アクティブレコードクラスが必要であり、初期化する必要があります。

方法:ファイルconfig/initializers/load_classes_for_dj.rbを作成します。それに次の行を追加します。

require 'lib/libtest/delayed_test.rb'
DelayedTest

Config/application.rbのconfig.autoload_pathsに「#{config.root}/lib/libtest」がある場合は、requireを実行する必要がないことに注意してください。

出典: Rails Delayed Job&Library Class

2-シングルトンモジュールを実装するクラスは、次の呼び出しでは機能しません:SingletonClass.instance.delay.sayhello

これを修正するには、次のようにします。

class SingletonClass
 include Singleton

 # create a class method that does the call for you
 def self.delayed_sayhello
  SingletonClass.instance.sayhello
 end

 def sayhello
  # this is how you can actually write to delayed_job.log
  # https://stackoverflow.com/questions/9507765/delayed-job-not-logging
  Delayed::Worker.logger.add(Logger::INFO, "hello there")
 end
end

遅延クラスメソッドを呼び出すには、次の手順を実行します。

SingletonClass.delay.delayed_sayhello

はい、ここでクラスの.delayを呼び出しています。 Rubyのクラスもオブジェクトであるため、ここでの呼び出しは有効であり、クラスメソッド「delayed_sayhello」にアクセスできます。

3- ActiveRecordオブジェクトまたはいくつかの複雑なオブジェクトを呼び出しに渡すのではなく、IDを渡し、delayedメソッドでデータベース内のオブジェクトを検索してから、次の作業を行います。

しないでください:

DelayedClass.new.delay.do_some_processing_on_album Album.first

この代わりに行う:

    DelayedClass.new.delay.do_some_processing_on_album Album.first.id

そしてDelayedClassdo_some_processing_on_album内で、

a = Album.find_by_id id

私がしばらく前に見たこれについてのstackoverflowの投稿がありました-どちらかわかりません:-)

4-完了するために、これはメーラーを行う方法です(deliverメソッドを呼び出さないでください):

Notifier.delay.signup(user_id)

3のように、ユーザーのオブジェクトではなくIDを渡し、signupメソッド内でルックアップを実行します。

上記のガイドラインに従っていることを確認したら、次を使用できます。

Delayed::Worker.logger.add(Logger::INFO, "hello")

それでも問題が発生する場合は、問題を解決することをお勧めします。

a-新しいクラスを作成しますb-ステップ1に従ってクラスが含まれ、初期化されていることを確認しますc-ステップ4からログを追加し、MyNewClass.new.delayを呼び出して動作するかどうかを確認します

これが皆さんのお役に立てば幸いです:-)

1
Abdo

ActiveRecord :: Base.loggerを変更することを忘れないでください

Delayed::Worker.logger = Logger.new("log/delayed_job.log", 5, 104857600)
if caller.last =~ /script\/delayed_job/ or (File.basename($0) == "rake" and ARGV[0] =~ /jobs\:work/)
  ActiveRecord::Base.logger = Delayed::Worker.logger
end

より詳細な回答: delayed_jobログの「プット」、SQLクエリ、およびジョブのステータスがあります

0
Peter P.