7

Non riesco a registrare i messaggi dal mio processo delayed_job. Ecco il lavoro che viene eseguito.delayed_job non logging

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 

Ho provato vari livelli di registrazione, e ho config.log_level =: eseguire il debug nella mia configurazione dell'ambiente. Corro delayed_job da Monit. Sto usando delayed_job 3.0.1 con Ruby 1.9.3 e rails 3.0.10.

+0

Un'idea potrebbe essere che è in conflitto perché delayed_job sta usando questo file di registro pure. Hai provato un altro nome? – iltempo

+0

Ho provato un nome diverso. Il nuovo file di registro viene creato ma non viene registrato nulla. – freedrull

risposta

16

Un'esplosione potrebbe essere che il lavoro viene inizializzato solo una volta dal lato produttore. Quindi viene serializzato, consegnato attraverso la coda (database per esempio) e non serializzato nel lavoratore. Ma il metodo di inizializzazione non viene chiamato di nuovo nel processo di lavoro. Solo il metodo perform viene chiamato tramite send.

Tuttavia è possibile riutilizzare il logger lavoratori di scrivere nel file di registro:

class MyJob 
    def perform 
    say "performing like hell" 
    end 

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

Non dimenticare di riavviare i lavoratori.

+0

Questo metodo ha funzionato per me. Grazie! – freedrull

+1

Ricevo questo "TestJob non riuscito con NoMethodError: metodo non definito' add 'per nil: NilClass ". La risposta di Raghus la risolse. – idrinkpabst

3

Non vedo perché si dovrebbe impostare il logger nel lavoro. Quando ho fatto questo ho impostato il lavoratore per utilizzare un file specifico all'inizio, ad es. Logger.new("log/worker_#{worker_number}") che assicura che ogni lavoratore presenti i propri file e non si deve preoccupare di più lavoratori che scrivono sullo stesso file nello stesso momento (disordinato).

Inoltre, in plain ol 'ruby è possibile chiamare @logger.info "logging from delayed_job".

Infine, sono abbastanza sicuro che 'eseguire' viene chiamato direttamente dal vostro lavoratori e un'istanza, in modo da poter refactoring a:

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

In realtà non ero in grado di refactoring in questo modo, non credo che eseguire prende argomenti. Non ho provato il tuo metodo di registrazione dal momento che la risposta precedente ha funzionato, ma credo di averlo provato prima e non ha funzionato. – freedrull

+0

Hai ragione, dovrei impostare il logger su un inizializzatore o qualcosa invece di impostarlo nel lavoro. – freedrull

10

In RAILS_ROOT/config/initializers hanno un file chiamato delayed_job_config.rb con queste righe:

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

Ricordarsi di riavviare i lavoratori dopo aver eseguito questa operazione.

fatemi sapere se questo aiuta

+0

'auto_flushing' è stato deprecato in rails 3 e sembra essere stato rimosso nelle versioni successive –

0

Questo sta lavorando bene per me in Rails 3.2:

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