2009-10-19 13 views
15

Tengo un corte de 1GB de slicehost y tengo 4 proyectos ejecutándose en ese cuadro. Las 4 aplicaciones son ruby ​​on rails. Me preguntaba cuál es la mejor manera de garantizar que los archivos de registro se roten.Cuál es la mejor manera de rotar registros para la aplicación de rieles

Preferiría tener 4 archivos de registro diferentes, uno para cada aplicación, en lugar de tener un archivo de registro grande para las 4 aplicaciones.

Estoy ejecutando ubuntu.

Estoy corriendo pasajero.

+0

duplicado posible de [Ruby on Rails rotación de los registros de producción] (http://stackoverflow.com/questions/4883891/ruby-on-rails-production-log-rotation) – tirdadc

Respuesta

15

También uso logrotate (deberá instalar vía apt-get). Cree un nuevo archivo logrotate en su directorio /etc/logrotate.d/. He aquí un ejemplo de una de las minas:

# for the rails logs 
/home/apps/*/shared/log/*log { 
    daily 
    rotate 14 
    notifempty 
    missingok 
    compress 
    sharedscripts 
    postrotate 
    /usr/bin/touch /home/apps/application1/current/tmp/restart.txt 
    /usr/bin/touch /home/apps/application2/current/tmp/restart.txt 
    endscript 
} 
# for the apache logs 
/home/apps/logs/*log { 
    daily 
    rotate 14 
    notifempty 
    missingok 
    compress 
    sharedscripts 
    postrotate 
    /etc/init.d/apache2 restart 
    endscript 
} 

Esto hace girar ambos carriles production.log registros y los registros de acceso/error de Apache (ejecuto mis aplicaciones bajo pasajero).

+0

Gracias por dar un ejemplo, creo que es útil. Sin embargo, ¿por qué reinicias tus aplicaciones después de rotar los registros? –

+1

Si no reinicia la aplicación (o apache para el caso), tendrá un problema con los registros que ya no se anexan. Podría estar equivocado, pero sé que esto fue un problema en el pasado. –

+1

Si agrega una opción copytruncate esto copiará su prod.log a prod.log.0 y luego truncará prod.log, dejando intactos los descriptores de archivos y no tendrá que reiniciar la aplicación. Sin embargo, la opción de copiar automáticamente puede perder un poco de datos de registro a medida que gira los archivos. – Kamilski81

3

Esto es metaprogramación y si debe estar en ServerFault o SO es discutible.

logrotate, un paquete estándar para una serie de sistemas operativos, y puede apt-get install logrotate para obtenerlo si no lo tiene. Se puede forzar a rotar los registros que desee, usando el programa que desee y con diferentes políticas a la "gzip 7 días y luego rm" por archivo.

Investigar /etc/logrotate.d.

+2

Fwiw, parece como un perfectamente válido programador tema para mí. Tiendo a pensar que SO es para programadores y no solo para programación. –

+0

Tiende a pensar en contra de lo que dice la FAQ, entonces. Punto tomado, sin embargo. –

5

que acababa de usar la rotación integrado ofrecido por el registrador de rieles:

# in config/application.rb 
config.logger = Logger.new(Rails.root.join('log', "#{Rails.env}.log"), 3, 10.megabytes) 

Esto hará girar los archivos de registro una vez que alcanzan 10 MB y guardar los 3 registros alternos más recientes.

+2

El único problema con el uso de Logger en lugar del BufferedLogger predeterminado, como descubrí por las malas, es que si está usando múltiples procesos/subprocesos en su servidor de aplicaciones (Passenger, Unicorn ... básicamente cualquier cosa además de Webrick), los mensajes se intercalar – Duke

+0

Hmm, he estado haciendo pesadas pruebas de carga contra Passenger con varios procesos escribiendo mensajes únicos a través de varias llamadas a un Logger simple con parámetros de rotación, y no he visto ningún entrelazado. Voy a estar pendiente de esto ahora. –

+0

Si bien no he visto mensajes divididos e intercalados, veo que los registros se rotan antes de llegar a 10M cuando el sistema está bajo carga y los mensajes completos están fuera de servicio. –

2

Aquí está mi procedimiento de instalación de capistrano. Copio esto en el archivo de implementación y simplemente lo ejecuto cuando creo el entorno del servidor para la aplicación, o si hay algún cambio en la configuración del logrotate.

namespace :setup do 
    task :install_logrotation, :roles => :app do 
    logrotate = <<-BASH 
     #{shared_path}/log/*.log { 
     daily 
     missingok 
     rotate 30 
     compress 
     size 5M 
     delaycompress 
     sharedscripts 
     postrotate 
      #{signal_unicorn("USR1")} 
     endscript 
     } 
    BASH 
    tmpfile = "/tmp/#{application}.logrotate" 

    put(logrotate, tmpfile) 
    run "#{sudo} chown root:root #{tmpfile} && #{sudo} mv -f #{tmpfile} /etc/logrotate.d/#{application}" 
    end 
end 

(Ah, y signal_unicorn sólo lo hace un "# {} sudo matar {señal} cat #{unicorn_pid} -s #";. USR1 dice que para volver a cargar todos sus archivos por lo que añadirá al nuevo archivo de registro)

Diviértete!

2

Recientemente tuvimos que lidiar con esto, y nos dimos cuenta de que logrotate es no la mejor solución. Su uso requiere que reinicies la aplicación de rieles cada vez que se rotan los registros, lo que parece un golpe de rendimiento innecesario.

Una mejor solución es anular el registrador de rieles predeterminado en el (los) archivo (s) de configuración de su aplicación.

# in config/environments/development.rb 
config.logger = Logger.new("#{Rails.env}.log", "daily") 

y, a continuación, utilice una secuencia de comandos que limpia archivos de más de n días. Puede usar logrotate para esta parte si lo desea.Utilizamos una tarea rake como,

desc "Cleanup application logs older than 30 days" 
task :logs => :environment do 
    require 'fileutils' 
    Dir.glob("#{Rails.root}/log/*.log.*"). 
    select{|f| File.mtime(f) < (Time.now - (60*60*24*30)) }. # older than 30 days 
    each { |f| 
     puts "Removing #{f}" 
     FileUtils.rm f 
    } 
end 
+4

La opción 'logrotate'' copytruncate' permite el truncado in situ del archivo de registro original, garantizando así que el servidor de rieles pueda seguir escribiendo en el registro cuando se rotan los registros. Por lo tanto, no es necesario reiniciar los rieles para la rotación de registros. –

+0

¿'apachectl graceful' produce un golpe de rendimiento aún notable? – timurb

+0

@Shyam Habarakada Solo para confirmar, este script que utilizas para limpiar registros más antiguos lo pones dentro de 'lib/tasks', ¿verdad? – Lykos

0

Para evitar tener que reiniciar la aplicación, como se señaló anteriormente, se puede utilizar la siguiente configuración logrotate completa:

/etc/logrotate.d/rails

<path_to_rails_app>/log/*.log { 
    daily 
    size 100M 
    missingok 
    notifempty 
    rotate 4 
    compress 
    delaycompress 
    copytruncate 
    nodateext 
} 
Cuestiones relacionadas