2011-02-03 13 views
150

¿Cuál es la mejor manera de habilitar la rotación de registros en una aplicación de producción de Ruby on Rails?Rotación del registro de producción de Ruby on Rails

¿Está utilizando logrotate en el servidor de alojamiento o hay un conjunto de opciones para usar al inicializar el registrador de la aplicación?

+0

Veo que ya hay una respuesta al respecto, pero quería preguntar cuál es su entorno. Uso el método syslog + logrotate, pero obviamente el tipo de entorno (ya sea dedicado, compartido, qué tipo * ix OS aloja, u otro, etc.) tendría algo que ver aquí. – ylluminate

Respuesta

183

Opción 1: syslog + logrotate

Puede configurar los rieles, a utilizar los sistemas de herramientas de registro.

Un ejemplo en config/environments/production.rb.

# Use a different logger for distributed setups 
config.logger = SyslogLogger.new 

De esta manera, se conecte a syslog, y puede utilizar las herramientas logrotate por defecto para girar los troncos.

Opción 2: carriles normales registros + logrotate

Otra opción es simplemente configurar logrotate para recoger los registros dejados por los rieles. En Ubuntu y Debian eso sería, por ejemplo, en un archivo llamado /etc/logrotate.d/rails_example_com.

/path/to/rails.example.com/tmp/log/*.log { 
    weekly 
    missingok 
    rotate 52 
    compress 
    delaycompress 
    notifempty 
    copytruncate 
} 

Según sugerencias a continuación, en los carriles que se aconseja utilizar copytruncate, para evitar tener que reiniciar la aplicación Rails.

Editar: eliminó "sharedscripts/endscript" ya que no se usan aquí y causa problemas según los comentarios. Y eliminado create 640 root adm según el comentario sugerido.

+3

Para utilizar logrotate, ¿la línea "config.logger = SyslogLogger.new" en config/environments/production.rb permanece comentada, o debería ser descomentada? – robertwbradford

+2

Debe permanecer comentado, para que los archivos de registro se escriban en (por ejemplo): /var/www/myrailsapp/current/log/production.log –

+3

Si usa la solución 'logrotate', vale la pena la respuesta de @ amit-saxena - sugiere el uso de 'copytruncate' sobre la directiva' create'. –

49

Si está utilizando logrotate, puede elegir cualquiera de las opciones que se muestran a continuación colocando un archivo conf en el directorio /etc/logrotate.d/.

# Rotate Rails application logs based on file size 
# Rotate log if file greater than 20 MB 
/path/to/your/rails/applicaton/log/*.log { 
    size=20M 
    missingok 
    rotate 52 
    compress 
    delaycompress 
    notifempty 
    copytruncate 
} 

O

# Rotate Rails application logs weekly 
/path/to/your/rails/applicaton/log/*.log { 
    weekly 
    missingok 
    rotate 52 
    compress 
    delaycompress 
    notifempty 
    copytruncate 
} 

Tenga en cuenta que copytruncate hace una copia de seguridad del registro actual y luego se borra el archivo de registro para la escritura continua. La alternativa es usar create, que realizará la rotación al renombrar el archivo actual y luego crear un nuevo archivo de registro con el mismo nombre que el anterior. Recomiendo encarecidamente que utilice copytruncate a menos que sepa que necesita crear. La razón por la cual Rails aún puede seguir señalando el archivo de registro anterior, aunque su nombre ha cambiado y es posible que deba reiniciar para localizar el nuevo archivo de registro. copytruncate lo evita manteniendo el mismo archivo que el archivo activo.

+0

¿Pero no debería reiniciar los raíles cada vez que ejecute logrotate? – lzap

+2

Truncar el archivo de registro original en su lugar después de crear una copia, en lugar de mover el archivo de registro anterior y opcionalmente crear uno nuevo , Se puede usar cuando no se le puede decir a algún programa que cierre su archivo de registro y así podría continuar escribiendo (anexando) al archivo de registro anterior para siempre. Tenga en cuenta que hay un segmento de tiempo muy pequeño entre copiar el archivo y truncarlo, por lo que algunos datos log- ging podrían perderse. Cuando se utiliza esta opción, la opción de crear no tendrá ningún efecto, ya que el archivo de registro anterior permanece en su lugar. – lzap

+1

No necesita reiniciar los rieles si está utilizando copytruncate porque aún apunta al mismo archivo de registro. –

-8

Habilite el envío de registros a loggly usando rails logglier de la siguiente manera en mi archivo environments/production.rb. Versión rieles es 4.1.0

RailsApplication::Application.configure do 
require 'logglier' 
config.logger = Logglier.new(<https://logs-01.loggly.com/inputs/inputkey>) 
log.info("hello from logglier") 
end 
+0

Por favor sugiérame algo qué hacer ... este código no funciona –

+0

La versión de Rails es 4.1.0 y la versión de Ruby es 2.1.1 –

18

para los carriles 5, esto es lo que tenía que hacer para limitar el tamaño del registro y no cambio de salida del servidor en la consola:

According to the documentation, si quieres limite el tamaño de la carpeta de registro, ponga esto en su archivo de entorno ('development.rb'/'production.rb').

config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024) 

Con esto, sus archivos de registro nunca crecerán más de 50Mb. Puede cambiar el tamaño según su preferencia.El '1' en el segundo parámetro significa que se mantendrá un archivo de registro histórico, por lo que tendrá hasta 100Mb de registros: el registro actual y el fragmento anterior de 50Mb.

Source to this solution.

+0

El primer argumento es filename, simplemente hablando, es decir 'log/development.log'. Así que preferiría una forma más larga pero transparente. En lugar de 'config.paths ['log']. First'Indí' Rails.root.join ('log', "# {Rails.env}.log ")' –

+0

Funcionará en rieles 4? –

+1

@ZiaUlRehmanMughal Sí, funciona con Rails 4. Estoy usando Rails 4.2.3, con una configuración como esta: 'config.logger = ActiveSupport :: Logger.new (config .log_file, 1, 20 * 1024 * 1024) ' – ThienSuBS

0

Por cada registro: Carriles de troncos, Rpush registro, ... Usted puede usar como esto en su archivo de configuración de servicio:

config.log_file = 'log/rpush.log' 
config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024) 

Significa: sólo se ahorra 1 archivo de registro anterior después de dividir. Tamaño de registro principal que nunca supera los 20 MB.