簡體   English   中英

delay_job未記錄

[英]delayed_job not logging

我無法記錄我的delay_job進程中的消息。 這是正在運行的作業。

class MyJob
  def initialize(blahblah)
    @blahblah = blahblah
    @logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'))
  end
  def perform
    @logger.add Logger::INFO, "logging from delayed_job"
    #do stuff
  end
end

我嘗試了各種日志記錄級別,並且我的環境配置中有config.log_level =:debug。 我從monit運行delay_job。 我正在將delay_job 3.0.1與ruby 1.9.3和rails 3.0.10一起使用。

一個推斷可能是作業在生產者端僅初始化一次。 然后將其序列化,通過隊列(例如數據庫)傳遞,並在工作線程中取消序列化。 但是不會在工作進程中再次調用initialize方法。 通過send僅調用perform方法。

但是,您可以重用worker記錄器以寫入日志文件:

class MyJob
  def perform
    say "performing like hell"
  end

  def say(text)
    Delayed::Worker.logger.add(Logger::INFO, text)
  end
end

不要忘記重新啟動工作程序。

在RAILS_ROOT / config / initializers中,有一個名為delay_job_config.rb的文件,其內容如下:

Delayed::Worker.logger = Rails.logger
Delayed::Worker.logger.auto_flushing = true

執行此操作后,請記住要重新啟動您的工作人員。

讓我知道這是否有幫助

我不明白為什么要在工作中設置記錄器。 完成此操作后,我將工作程序設置為在啟動時使用特定文件,例如Logger.new("log/worker_#{worker_number}") ,以確保每個工作程序輸出到其自己的文件,而您不必擔心多個工作人員同時寫入同一文件(混亂)。

另外,在普通紅寶石中,您可以將@logger.info "logging from delayed_job"

最后,我很確定'perform'是由您的工作人員直接調用並實例化的,因此您可以重構為:

class MyJob
 def perform(blahblah)
  @logger.add Logger::INFO, "logging from delayed_job"
  @blahblah = blahblah
  #do stuff
 end
end

在Rails 3.2中,這對我來說工作得很好:

class FiveMinuteAggregateJob < Struct.new(:link, :timestamp)
  def perform
    Rails.logger.info 'yup.'
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM