22
#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ファイルのジョブ開始/成功/失敗のみです。

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

4

6 に答える 6

8

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

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

于 2011-01-10T15:44:01.027 に答える
6

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

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

シンプルだが機能する

于 2012-07-18T15:19:08.057 に答える
4

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


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


于 2011-08-28T20:26:03.930 に答える
4

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

/config/environments/development.rb

MyApp::Application.configure do

 [...]


 [...]


 [...]

 Delayed::Worker.logger = Rails.logger

end

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

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

于 2012-01-03T09:17:01.643 に答える
1

何か問題がある場合、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 & ライブラリ クラス

2- Singleton モジュールを実装するクラスは、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 を渡し、遅延メソッドでデータベース内のオブジェクトを検索してから、作業を行います。

するな:

DelayedClass.new.delay.do_some_processing_on_album Album.first

代わりにこれを行います:

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

DelayedClass do_some_processing_on_album 内で、

a = Album.find_by_id id

少し前に見たこれに関するstackoverflowの投稿がありました-どれかわかりません:-)

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

Notifier.delay.signup(user_id)

3 に従って、ユーザーのオブジェクトではなく ID を渡して、サインアップ メソッド内でルックアップを行います。

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

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

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

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

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

于 2013-03-28T00:15:09.463 に答える