2009-11-10 6 views
5

Ich schreibe gerade ein Projekt in Ruby, das den ActiveRecord Edelstein für die Datenbankinteraktion verwendet und ich versuche, alle Datenbankaktivitäten mit dem ActiveRecord::Base.logger Attribut mit dem folgenden CodeRuby Daemons verursacht ActiveRecord Logger IOError

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

Dies funktioniert gut für Wanderungen usw. (die aus irgendeinem Grunde, dass die Anmeldung zu verlangen scheinen aktiviert sein, da es einen NilClass Fehler gibt, wenn sie deaktiviert ist), aber wenn ich versuche, das Projekt auszuführen, die die Active Aufruf ein Gewinde Daemon Objekt das Skript schlägt mit dem folgenden Fehler fehl

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

Irgendwelche Ideen auf, wie man dieses Problem löst, würde sehr geschätzt. Im Moment habe ich begonnen, durch einen anderen Code, um zu sehen, wenn Menschen andere Möglichkeiten haben Active Protokollierung der Implementierung in einer Thread-sichere Weise

Dank

Patrick

Antwort

1

Es stellt sich heraus, dass für Migrationen die Variable ActiveRecord::Base.logger zu arbeiten kann nicht Null sein, was die erste Hälfte des Problems erklärt. Ich bin jedoch noch nicht in der Lage, den IOError zu beheben, wenn eine Datei anstelle von STDERR verwendet wird.

+0

würde das Problem stammen aus Synchronisation? Könnten Sie stattdessen Rails 'BufferedLogger verwenden und sehen, ob das das Problem behebt? –

+0

Wir haben am Ende eine einfache Logging-Anwendung für unsere Bedürfnisse mit DRB geschrieben, die Fehler für alle unsere Threads behandelt –

4

Ich stieß auf das gleiche Problem. Sie müssen zuerst dämonisieren und dann die die Rails-Umgebung laden.

+0

Könnten Sie erklären, was Sie meinen "dämonisieren und dann Rails env laden" –

+0

Daemons.run_proc ('your_daemon', daemon_options) {require File.expand_path (File.join (File.dirname (__ FILE__), '..', 'config', 'environment')) # tu Sachen} –

+0

@LoganKoester Beachten Sie, dass der Versuch, dir Informationen über '__FILE__' zu bekommen, nicht funktioniert arbeiten, nachdem Sie Daemonisiert haben, da der Prozess diese Information verliert. Sie müssen diesen Pfad vor der Daemonisierung speichern. – Kelvin

4

die delayed_job haben Dämonen und Active, vor daemonize verwendet, erhalten die Dateien opend haben, und öffnen Sie dann in 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

Sie tun etwas ähnliches in lib/delayed/command.rb – m33lky

+0

Vergessen Sie nicht, eine Schreibberechtigung hinzuzufügen. 'file.reopen file.path," a "' – Phil

Verwandte Themen