2009-11-10 14 views
5

Estoy escribiendo un proyecto por el momento en Ruby que hace uso de la gema ActiveRecord para la interacción de la base de datos y estoy tratando de registrar toda la actividad de la base de datos usando el atributo ActiveRecord::Base.logger con el siguiente códigoRuby Daemons causando ActiveRecord logger IOError

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

Esto funciona muy bien para las migraciones, etc (que por alguna razón parecen requerir que el registro esté habilitado, ya que da un error de NilClass cuando está desactivado) pero cuando trato de ejecutar el proyecto que incluye un demonio roscado llamando al ActiveRecord objeto el script falla con el siguiente error

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

Cualquier idea sobre cómo resolver este problema sería muy apreciada. Por el momento he empezado a mirar a través de otro tipo de código para ver si la gente tiene otras formas de implementar el registro de ActiveRecord de una manera más segura para los subprocesos

Gracias

Patrick

Respuesta

1

Resulta que para las migraciones para trabajar, la variable ActiveRecord::Base.logger no puede ser nula, lo que explica la primera mitad del problema. Todavía no puedo arreglar el error IOError cuando se usa un archivo en lugar de STDERR.

+0

¿El tallo problema de la sincronización? ¿Podría usar el BufferedLogger de Rails en su lugar y ver si eso solucionó el problema? –

+0

Terminamos escribiendo una aplicación de registro simple para nuestras necesidades usando DRB que manejaba errores para todos nuestros hilos –

4

Me encontré con el mismo problema. Primero tiene que demonizar y luego cargar el entorno Rails.

+0

¿Podría explicar a qué se refiere con "daemonize y luego cargar Rails env" –

+0

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

+0

@LoganKoester Tenga en cuenta que tratar de obtener información dir en '__FILE__' no Trabaja después de que hayas demonizado, ya que el proceso pierde esta información. Tendrás que guardar esa ruta antes de daemonizar. – Kelvin

4

la delayed_job han utilizado los demonios y activerecord, antes daemonize, obtener los archivos han opend y vuelva a abrir en 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

Hacen algo similar en lib/delay/command.rb – m33lky

+0

No olvide agregar un permiso de escritura. 'file.reopen file.path," a "' – Phil