7

我無法記錄來自我的delayed_job進程的消息。這是正在運行的工作。delayed_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運行delayed_job。我用ruby 1.9.3和rails 3.0.10使用delayed_job 3.0.1。

+0

一種觀點是,這是因爲delayed_job的是利用這個日誌文件,以及是相互矛盾的。你嘗試過別的名字嗎? – iltempo 2012-03-01 00:05:27

+0

我嘗試了一個不同的名字。新的日誌文件已創建,但沒有記錄到它。 – freedrull 2012-03-06 17:27:42

回答

16

解釋可能是作業只能在生產者端初始化一次。然後它被序列化,通過隊列傳遞(例如數據庫)並在工作者中進行反序列化。但是初始化方法不再在工作進程中被調用。只有執行方法通過發送調用。

但是可以重用工人記錄寫入日誌文件:

class MyJob 
    def perform 
    say "performing like hell" 
    end 

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

不要忘了重新啓動工人。

+0

此方法適用於我。謝謝! – freedrull 2012-03-13 19:36:39

+1

我得到這個「TestJob失敗與NoMethodError:未定義的方法'添加爲零:NilClass」。拉古斯的答案確定了這一點。 – idrinkpabst 2013-04-23 22:05:34

3

我不明白你爲什麼要在工作中設置記錄器。當我完成這些工作時,我將工作人員設置爲在開始時使用特定的文件,例如Logger.new("log/worker_#{worker_number}")確保每個工作人員輸出到它自己的文件,並且您不必擔心多個工作人員同時寫入同一個文件(混亂)。

此外,在普通的醇紅寶石,你可以撥打@logger.info "logging from delayed_job"

最後,我敢肯定,「執行」由你的工人直接調用和實例化,這樣你就可以重構爲:

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

我實際上不能重構那種方式,我不認爲執行會帶來任何爭論。自從上一個答案奏效以來,我沒有嘗試過您的日誌記錄方法,但我相信我記得以前嘗試過,並且它不起作用。 – freedrull 2012-03-14 17:06:22

+0

你說得對,我應該把記錄器設置在初始化器或其他東西中,而不是將它設置在作業中。 – freedrull 2012-03-14 17:07:06

10

在RAILS_ROOT /配置/初始化呼籲delayed_job_config.rb文件與這些行:

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

記得在這樣做後重新啓動你的工人。

讓我知道,如果這有助於

+0

'auto_flushing'在rails 3中被棄用,似乎已經在更高版本中被刪除 – 2017-07-24 19:05:48

0

這工作得很好,我在Rails的3.2:

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