7

Nie mogę rejestrować wiadomości z mojego procesu delayed_job. Oto zadanie, które jest uruchamiane.delayed_job nie loguje się

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 

Próbowałem różnych poziomów rejestrowania i mam config.log_level =: debug w mojej konfiguracji środowiska. Uruchomę delayed_job z monit. Używam delayed_job 3.0.1 z rubinem 1.9.3 i szynami 3.0.10.

+0

Jednym z pomysłów byłoby to, że jest to sprzeczne z powodu delayed_job używa tego pliku dziennika, jak również. Czy próbowałeś innego imienia? – iltempo

+0

Próbowałem innej nazwy. Nowy plik dziennika jest tworzony, ale nic nie jest do niego rejestrowane. – freedrull

Odpowiedz

16

Wyjaśnienie może być takie, że zadanie zostanie zainicjowane tylko raz u producenta. Następnie jest serializowany, dostarczany przez kolejkę (na przykład baza danych) i niezsrywalizowany w module roboczym. Ale metoda initialize nie jest ponownie wywoływana w procesie roboczym. Tylko metoda perform jest wywoływana przez send.

Jednak można ponownie wykorzystać rejestrator pracowników do zapisu pliku dziennika:

class MyJob 
    def perform 
    say "performing like hell" 
    end 

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

Nie zapomnij zrestartować robotników.

+0

Ta metoda zadziałała dla mnie. Dzięki! – freedrull

+1

Otrzymuję to "TestJob nie powiodło się z NoMethodError: undefined metoda' add 'for nil: NilClass ". Odpowiedź Raghusa to naprawiła. – idrinkpabst

3

Nie rozumiem, dlaczego ustawiłeś rejestrator w zadaniu. Kiedy to zrobiłem, ustawiłem robotnika tak, aby używał określonego pliku na początku, na przykład Logger.new("log/worker_#{worker_number}") co zapewnia, że ​​każdy pracownik generuje własny plik i nie musisz się martwić, że wielu pracowników zapisuje do tego samego pliku w tym samym czasie (bałagan).

Również w zwykłym rubiniu można zadzwonić pod numer @logger.info "logging from delayed_job".

Wreszcie, jestem całkiem pewny, że „wykonywanie” jest wywoływany bezpośrednio przez pracownika i wystąpienia, można więc byłaby do:

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

Tak naprawdę nie byłem w stanie tego zmienić, nie sądzę, że performer przyjmuje jakiekolwiek argumenty. Nie próbowałem twojej metody logowania, ponieważ poprzednia odpowiedź zadziałała, ale wydaje mi się, że pamiętam, że próbowałem ją wcześniej i to nie działało. – freedrull

+0

Masz jednak rację, powinienem ustawić rejestrator w inicjalizatorze lub coś innego niż ustawienie go w zadaniu. – freedrull

10

W RAILS_ROOT/config/inicjalizatorów mieć plik o nazwie delayed_job_config.rb z tymi liniami:

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

Pamiętaj o ponownym uruchomieniu pracowników po wykonaniu tej czynności.

Daj mi znać, jeśli to pomaga

+0

'auto_flushing' został uznany za przestarzały w szynach 3 i prawdopodobnie został usunięty w późniejszych wersjach –

0

To działa dobrze dla mnie w Rails 3.2:

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