#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ファイルのジョブ開始/成功/失敗のみです。
これは、ワーカーのバグやメモリリークの検出など、大きな問題を引き起こしています。助けてください!
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.logger
をRails_DEFAULT_LOGGER
に置き換えてみてください。
これは簡単な回避策かもしれませんが、私にとっては十分に機能します。
system("echo #{your message here} >> logfile.log")
シンプルだが機能する
イニシャライザで次の設定で動作しています。
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
私は単にこれをしました:
/config/environments/development.rb
MyApp::Application.configure do
[...]
[...]
[...]
Delayed::Worker.logger = Rails.logger
end
次のリクエストごとに、メールがログに表示されます。
[〜#〜] note [〜#〜]:ログに記録されているメールにページを更新する必要がある場合があります。サーバーを再起動することを忘れないでください;)
何か問題がある場合、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を呼び出して動作するかどうかを確認します
これが皆さんのお役に立てば幸いです:-)
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