7

No puedo registrar mensajes de mi proceso de retraso de trabajo. Aquí está el trabajo que se está ejecutando.retaryed_job no inicia sesión

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 

He intentado varios niveles de registro, y tengo config.log_level =: debug en la configuración de mi entorno. Ejecuto retrayed_job desde Monit. Estoy usando retrayed_job 3.0.1 con ruby ​​1.9.3 y rieles 3.0.10.

+0

Una idea sería que es contradictoria porque delayed_job está utilizando este archivo de registro también. ¿Has probado con otro nombre? – iltempo

+0

Intenté con un nombre diferente. Se crea el nuevo archivo de registro pero no se registra nada. – freedrull

Respuesta

16

Una explicación podría ser que el trabajo se inicializa solo una vez en el lado del productor. Luego se serializa, se entrega a través de la cola (base de datos, por ejemplo) y se deserializa en el trabajador. Pero el método de inicialización no se vuelve a llamar en el proceso de trabajo. Solo el método de ejecución se llama mediante envío.

Sin embargo se puede reutilizar el registrador de los trabajadores a escribir en el archivo de registro:

class MyJob 
    def perform 
    say "performing like hell" 
    end 

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

no se olvide de reiniciar los trabajadores.

+0

Este método funcionó para mí. ¡Gracias! – freedrull

+1

Me sale este "TestJob fallido con NoMethodError: método indefinido' add 'for nil: NilClass ". La respuesta de Raghus lo solucionó. – idrinkpabst

3

No veo por qué debería configurar el registrador en el trabajo. Cuando hice esto, configuré al trabajador para que use un archivo específico al inicio, p. Logger.new("log/worker_#{worker_number}"), lo que garantiza que cada trabajador imprima en su propio archivo y no tenga que preocuparse de que varios trabajadores escriban en el mismo archivo al mismo tiempo (desordenados).

Además, en plain ol 'ruby puede llamar al @logger.info "logging from delayed_job".

Por último, estoy bastante seguro de que 'realizar' se llama directamente por el trabajador y la instancia, por lo que puede refactorizar a:

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

En realidad, no pude refactorizar de esa manera, no creo que el desempeño tenga ningún argumento. No probé su método de registro ya que la respuesta anterior funcionó, pero creo que recuerdo haberlo intentado antes y no funcionó. – freedrull

+0

Sin embargo, tiene razón, debo configurar el registrador en un inicializador o algo así en lugar de configurarlo en el trabajo. – freedrull

10

En RAILS_ROOT/config/inicializadores de un archivo de haber llamado delayed_job_config.rb con estas líneas:

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

Recuerde volver a iniciar a sus trabajadores después de hacer esto.

Vamos a saber si esto ayuda a

+0

'auto_flushing' ha quedado obsoleto en los rieles 3 y parece haberse eliminado en versiones posteriores –

0

Esto está trabajando muy bien para mí en Rails 3.2:

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