2010-12-05 13 views
5

Intento iniciar sesión desde un delayjob_job en rieles.Log from within collectiveidea/delayyed_job

que lo configura de la siguiente manera:

Delayed::Worker.destroy_failed_jobs = false 
Delayed::Worker.max_attempts = 3 
Delayed::Worker.backend = :active_record 
Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/#{Rails.env}_delayed_jobs.log", Rails.logger.level) 
Delayed::Worker.logger.auto_flushing = 1 

definir mi trabajo:

class TestJob 

    def initialize(user) 
     @user = user 
    end 


    #called when enqueue is performed 
    def enqueue(job) 
     Delayed::Worker.logger.info("TestJob: enqueue was called") 
    end 

    def perform 
     Delayed::Worker.logger.info("\n\n\n\nTestJob: in perform, for user #{@user.twitter_username}") 
    end 
end 

Pero cuando llamo enquee en mi trabajo

Delayed::Job.enqueue(TestJob.new(user), 2) 

Los archivos de registro permanecen vacías, incluso aunque la tabla delayed_jobs muestra que el trabajo se realizó.

¿Alguna idea?

+1

Parece que no estás solo: http://stackoverflow.com/questions/3500200/getting-delayed-job-to-log –

Respuesta

0

Pruébalo sin usar el espacio de nombres de DJ.

Aquí está el código de un trabajo que estaba usando hace un tiempo. Nota: Logger.new se agregará a un archivo .log si ya existe.

class ScrapingJob < Struct.new(:keyword_id) 
    def perform 
     begin 
     ... 
     rescue => error 
     log = Logger.new("#{Rails.root}/log/scraping_errors.log") 
     log.debug "logger created for '#{keyword.text}' (#{keyword.id}) on '#{keyword.website.url}' (#{keyword.website.id})" 
     log.debug "time: #{measured_at.to_s(:short)}" 
     log.debug "error: #{error}" 
     log.debug "" 
     end 
    end 
    end 
0

Mi supongo que es un problema de serialización con DJ intentar serializar el objeto User. DJ hace un mal trabajo al plantear esos errores.

¿Estás usando Mongoid por casualidad? Sé que hay problemas con JSONizing un objeto Mongoid.

¿Funciona si pasa la cadena user_id al trabajo, en lugar del objeto User? así ...

class TestJob 

    def initialize(user_id) 
     @user = User.find(user_id) 
    end 

    # ... 

end 

A pesar de que no es tan bonita, creo que es la mejor práctica para pasar literales (cadenas, flotadores, etc ...) a DelayedJob o cualquier trabajador de fondo. Esto hace que sea más fácil intercambiar procesadores en caso de que desee migrar a Resque en el futuro.