2009-11-10 20 views
5

Piszę teraz projekt w języku Ruby, który korzysta z klejnotu ActiveRecord do interakcji z bazą danych i próbuję zarejestrować całą działalność bazy danych za pomocą atrybutu ActiveRecord::Base.logger z następującym kodem:Demony Rubiego wywołujące rejestrator ActiveRecord IOError

ActiveRecord::Base.logger = Logger.new(File.open('logs/database.log', 'a')) 

działa to dobrze dla migracje itp (które z jakiegoś powodu wydaje się wymagać rejestrowanie być włączony, ponieważ daje błąd NilClass gdy jest wyłączona), ale gdy próbuję uruchomić projekt, który zawiera gwintowaną demona wywołanie ActiveRecord obiekt skrypt nie powiedzie się z następującym błędem:

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/logger.rb:504:in `write': closed stream (IOError) 

Wszelkie pomysły na rozwiązanie tego problemu byłyby bardzo cenne. W tej chwili zacząłem patrzeć przez inny kod, aby zobaczyć, czy ludzie mają inne sposoby realizacji rejestrowanie ActiveRecord w bardziej bezpieczny wątku sposób

Thanks

Patricka

Odpowiedz

1

Okazuje się, że dla migracji do pracy zmienna ActiveRecord::Base.logger nie może być pusta, co wyjaśnia pierwszą połowę problemu. Nie mogę jeszcze naprawić błędu IOError, gdy zamiast STDERR używany jest plik.

+0

Czy trzpień Problem z synchronizacją? Czy mógłbyś zamiast tego użyć Rails 'BufferedLogger i sprawdzić, czy to rozwiązało problem? –

+0

W końcu napisaliśmy prostą aplikację do rejestrowania dla naszych potrzeb, używając DRB, który obsługiwał błędy dla wszystkich naszych wątków. –

4

Wpadłem na ten sam problem. Najpierw musisz zdememonizować, a następnie , a następnie załadować środowisko Rails.

+0

Czy mógłbyś wyjaśnić, co masz na myśli przez "daemonize, a następnie załaduj Rails env" –

+0

Daemons.run_proc ('twoja_daemon', daemon_options) {wymagaj File.expand_path (File.join (File.dirname (__ FILE__), '..', 'config', 'environment')) # do stuff} –

+0

@LoganKoester Pamiętaj, że próba uzyskania informacji o dir na "__FILE__" nie będzie działa po demonizacji, ponieważ proces traci te informacje. Będziesz musiał zapisać tę ścieżkę przed demonowaniem. – Kelvin

4

delayed_job wykorzystali demonów i ActiveRecord, przed daemonize, uzyskać pliki otworzyłem drzwi, a następnie ponownie otworzyć w daemonize

@files_to_reopen = [] 
ObjectSpace.each_object(File) do |file| 
    @files_to_reopen << file unless file.closed? 
end 

Daemons.run_proc("xxxxx_name",:dir=>pid_file,:dir_mode=>:normal) do 
    Dir.chdir(Rails.root) 
    # Re-open file handles 
    @files_to_reopen.each do |file| 
    begin 
     file.reopen file.path 
     file.sync = true 
    rescue ::Exception 
    end 
    end 
end 
+1

Robią coś podobnego w lib/delayed/command.rb – m33lky

+0

Nie zapomnij dodać uprawnienia do zapisu. 'file.reopen file.path," a "' – Phil

Powiązane problemy