2010-08-17 14 views
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 

que aún no hay mensajes de registro de trabajo atrasado en mis carriles registros o archivos de registro de trabajos retraso, los únicos mensajes que veo están empezando empleos/éxito/fracaso en el archivo delayed_jobs.log .Primeros retraso trabajo para iniciar la sesión

esto está causando grandes problemas, ¡incluyendo la detección de errores y fugas de memoria en los trabajadores es casi imposible! ¡Por favor ayuda!

Respuesta

8

Hemos conseguido que funcione en Rails 3/Delayed Job 2.0.3 pirateando Rails.logger en sí para utilizar un archivo de registro diferente (el que queremos para las entradas de retraso de trabajo) y también configurar el registrador de trabajos diferidos para usar el mismo objeto exacto:

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 

Si el código anterior no funciona, intente reemplazar Rails.logger con RAILS_DEFAULT_LOGGER.

+1

dónde le has puesto este código? Seguramente no solo en 'environment.rb' ...? – rfunduk

+2

Aquí está todo: https://gist.github.com/833828 –

+1

Esta debería ser la respuesta aceptada, ya que es la única solución que escribe los mensajes de estado del trabajo, todas las consultas SQL, así como los registros personalizados (utilizando 'logger.level', no' puts') a un archivo de registro dedicado a delayyed_job. – samvermette

4

tengo que trabajar con la siguiente configuración en el inicializador:

 

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 

 
+0

Este código solo agrega las consultas sql al archivo 'environment.log'. No más registros de estado de trabajo, y nada se escribe en 'retrayed_job.log'. – samvermette

+0

Los Rails recientes no necesitan esto de todos modos. Tengo lo siguiente, y funciona como esperaba: Delayed :: Worker.logger = ActiveSupport :: BufferedLogger.new (Rails.root.join ('log/worker.log')) – Roman

+0

acaba de probar esto y worker.log solo obtiene los mensajes de estado del trabajo. Sin consultas SQL, sin mensajes de registrador personalizados. – samvermette

4

i simplemente hicieron esto:

/config/environments/development.rb 

MyApp::Application.configure do 

[...] 


[...] 


[...] 

Delayed::Worker.logger = Rails.logger 

end 

En cada solicitud siguiente que haces se parece el correo en el registro.

NOTA: A veces hay que actualizar la página para que el correo electrónico se registre en el registro. No se olvide de reiniciar el servidor;)

+1

Gracias por la sugerencia, he agregado esto a config/environments/application.rb y funciona en todos los entornos – gouravtiwari21

6

Ésta puede ser una solución simple pero funciona lo suficientemente bien como para mí:

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

simple pero funciona

+0

+1 - ¡Gracias! Obviamente, esto no es ideal para el código de producción, pero es útil cuando estás tratando de localizar un error y asegurarse de que todo se llame correctamente. –

1

DelayedJob no parece salida si existe es algo malo:

clases récord

1- no activos necesitan ser requerida y inicializado:

Cómo: Crear una estafa archivo fig/inicializadores/load_classes_for_dj.rb Añadir a que las líneas:

require 'lib/libtest/delayed_test.rb' 
DelayedTest 

Tenga en cuenta que si tiene '# {config.root}/lib/libtest' en config.autoload_paths en config/application.rb, se no necesita hacer el requerimiento.

Fuente: Rails Delayed Job & Library Class

2- Las clases que implementan el módulo Singleton no funcionará llamando: SingletonClass.instance.delay.sayhello

Con el fin de arreglar eso, haga lo siguiente:

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 

con el fin de llamar al método de la clase retrasada, haga lo siguiente:

SingletonClass.delay.delayed_sayhello 

Sí, estoy llamando a .delay en una clase aquí.Dado que las clases en Ruby también son objetos, la llamada es válida aquí y me permite acceder al método de clase "delayed_sayhello"

3- No pase objetos ActiveRecord u otros objetos complejos a su llamada, sino que pase los identificadores, busque el los objetos de la base de datos en su método de retraso, y luego hacer su trabajo:

no hago:

DelayedClass.new.delay.do_some_processing_on_album Album.first 

debe hacerse lo siguiente:

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

y en el interior DelayedClass do_some_processing_on_album, hacer

a = Album.find_by_id id 

Hubo un post StackOverflow sobre el que yo vi hace un tiempo - pero no estoy seguro :-)

4- Para finalizar, este es cómo hacer anuncios publicitarios (no llame al método de entrega):

Notifier.delay.signup(user_id) 

Según 3, no pasan objeto del usuario sino más bien su identificación, hacer la búsqueda dentro de la meto de registro re.

Ahora, una vez que tenga la certeza de haber seguido las pautas anteriores, puede utilizar:

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

Si todavía se enfrentan a problemas, sugiero usted analiza su problema:

una - Cree una nueva clase b- Asegúrese de tenerla incluida e inicializada según el paso 1 c- Agregue el registro desde el paso 4 e intente llamar a MyNewClass.new.delay para ver si funciona

espero que esto ayude a ustedes :-)

0

no se olvide de cambiar el ActiveRecord :: Base.logger

Delayed::Worker.logger = Logger.new("log/delayed_job.log", 5, 104857600) 
if caller.last =~ /script\/delayed_job/ or (File.basename($0) == "rake" and ARGV[0] =~ /jobs\:work/) 
    ActiveRecord::Base.logger = Delayed::Worker.logger 
end 

respuesta más detallada: Have delayed_job log "puts", sql queries and jobs status

Cuestiones relacionadas