2010-08-17 5 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 

je ne vois pas de messages du journal de travail retardé dans mes rails journaux ou retardé fichier journal de travail, les seuls messages que je vois sont des emplois commencent/succès/échec dans le fichier delayed_jobs.log .Mise en emploi retardée pour se connecter

cela cause de gros problèmes, y compris la détection de bugs et de fuites de mémoire chez les travailleurs presque impossible! S'il vous plaît aider!

Répondre

8

Nous l'avons fait fonctionner sur Rails 3/Delayed Job 2.0.3 en piratant Rails.logger lui-même pour utiliser un fichier journal différent (celui que nous voulons pour les entrées de delayed_job) et en définissant le journal de travail retardé à utiliser exactement le même objet:

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 le code ci-dessus ne fonctionne pas, essayez de remplacer Rails.logger avec RAILS_DEFAULT_LOGGER.

+1

Où avez-vous mis ce code? Sûrement pas juste dans 'environment.rb' ...? – rfunduk

+2

Voici la pleine chose: https://gist.github.com/833828 –

+1

Cela devrait être la réponse acceptée, car c'est la seule solution qui écrit les messages d'état du travail, toutes les requêtes SQL, ainsi que les journaux personnalisés (en utilisant 'logger.level', pas' puts') dans un fichier journal dédié à delayed_job. – samvermette

4

Je l'ai travailler avec la configuration suivante initialiseur:

 

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

Ce code ajoute uniquement les requêtes sql au fichier 'environment.log'. Plus de journaux d'état de travail, et rien n'est écrit dans 'delayed_job.log'. – samvermette

+0

Le récent Rails n'en a pas besoin de toute façon. J'ai ce qui suit, et cela fonctionne comme prévu: Delayed :: Worker.logger = ActiveSupport :: BufferedLogger.new (Rails.root.join ('log/worker.log')) – Roman

+0

juste essayé cela et worker.log obtient seulement les messages d'état du travail. Aucune requête SQL, aucun message de journal personnalisé. – samvermette

4

i tout simplement pas ceci:

/config/environments/development.rb 

MyApp::Application.configure do 

[...] 


[...] 


[...] 

Delayed::Worker.logger = Rails.logger 

end 

Dans chaque demande suivante vous faites le courrier sera apparaître sur le journal.

REMARQUE: Il est parfois nécessaire d'actualiser la page pour qu'elle soit enregistrée dans le journal. Ne pas oublier de redémarrer le serveur;)

+1

Merci pour le conseil, j'ai ajouté ceci à config/environments/application.rb et fonctionne dans tous les environnements – gouravtiwari21

6

Cela peut être une solution simple mais il fonctionne assez bien pour moi:

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

simple mais fonctionne

+0

+1 - Merci! Évidemment, ce n'est pas idéal pour le code de production, mais c'est pratique lorsque vous essayez simplement de repérer un bug et de vous assurer que tout est correctement appelé. –

1

DelayedJob ne semble pas sortie en cas est quelque chose de mal:

1- cours d'enregistrement non actifs doivent être requis et initialisé:

Comment: Créer un fichier con fig/initializers/load_classes_for_dj.rb Ajoutez à cela les lignes:

require 'lib/libtest/delayed_test.rb' 
DelayedTest 

Notez que si vous avez '# {config.root}/lib/libtest' dans config.autoload_paths dans config/application.rb, vous n'a pas besoin de faire le nécessaire.

Source: Rails Delayed Job & Library Class

2- Les classes qui mettent en œuvre le module Singleton ne fonctionnera pas en appelant: SingletonClass.instance.delay.sayhello

Pour résoudre ce problème, procédez comme suit:

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 

pour appeler la méthode de classe retardée, procédez comme suit:

SingletonClass.delay.delayed_sayhello 

Oui, j'appelle .delay sur une classe ici.Puisque les classes dans Ruby sont aussi des objets, l'appel est valide ici et me permet d'accéder à la méthode de classe "delayed_sayhello"

3- Ne pas passer d'objets ActiveRecord ou d'objets complexes à votre appel mais plutôt passer des identifiants, chercher le objets dans la base de données dans votre méthode retardée, puis effectuez votre travail:

nE PAS fAIRE:

DelayedClass.new.delay.do_some_processing_on_album Album.first 

dO ceci:

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

et à l'intérieur DelayedClass do_some_processing_on_album, faire

a = Album.find_by_id id 

Il y avait un poste stackoverflow sur ce que j'ai vu il y a quelque temps - pas sûr :-)

4- Pour la fin, cela est comment faire mailers (ne pas appeler la méthode livrer):

Notifier.delay.signup(user_id) 

Comme par 3, ne passent pas l'objet de l'utilisateur, mais plutôt leur carte d'identité, faire la recherche dans la métho d'inscription ré.

Maintenant, une fois que vous avez vérifié que vous avez suivi les directives ci-dessus, vous pouvez utiliser:

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

Si vous rencontrez toujours des problèmes, je vous suggère de briser votre problème:

une - Créer une nouvelle classe b- Assurez-vous que vous l'avez inclus et initialisé par étape 1 c- Ajouter l'enregistrement de l'étape 4 et essayer d'appeler MyNewClass.new.delay pour voir si cela fonctionne

J'espère que cela vous aide les gars :-)

0

Ne pas oublier de changer le 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 

réponse plus détaillée: Have delayed_job log "puts", sql queries and jobs status

Questions connexes