Rotación de registro de producción de Ruby on Rails

172

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

¿Es mediante el uso de logrotate en el servidor de alojamiento o hay un conjunto de opciones para usar al inicializar el registrador desde la aplicación?

cnicolaou
fuente
Veo que ya hay una respuesta sobre esto, pero quería preguntar cuál es su entorno. Yo mismo uso el método syslog + logrotate, pero obviamente el tipo de entorno (ya sea dedicado, compartido; qué tipo * ix OS está alojando, o es otro, etc.) tendría algo que ver aquí.
iluminar

Respuestas:

203

Opción 1: syslog + logrotate

Puede configurar rieles para usar las herramientas de registro de sistemas.

Un ejemplo en config / assets / production.rb .

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

De esa manera, inicia sesión en syslog y puede usar las herramientas predeterminadas de rotación de registros para rotar los registros.

Opción 2: registros de Rails normales + logrotate

Otra opción es simplemente configurar logrotate para recoger los registros que dejan 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 las sugerencias a continuación, en Rails se recomienda usar copytruncate, para evitar tener que reiniciar la aplicación Rails.

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

Berkes
fuente
3
Para usar logrotate, ¿la línea "config.logger = SyslogLogger.new" en config / entornos / production.rb debe permanecer comentada, o debe ser descomentada?
robertwbradford
2
Debe permanecer comentado, para que los archivos de registro estén escritos (por ejemplo): /var/www/myrailsapp/current/log/production.log
Luca Spiller
3
Si usa la logrotatesolución, vale la respuesta de @ amit-saxena: sugiere el uso de copytruncatemás decreate directiva.
Tom Harrison
3
Cuando lo usa copytruncate, createno tiene ningún efecto, por lo que probablemente debería eliminarlo de su ejemplo
Michaël Witrant,
3
También es posible que deba agregar la línea su your_rails_user your_rails_groupcon el propietario y el grupo de sus archivos de registro (es decir, los del proceso Rails / Passenger) o (versiones recientes de?) Logrotate puede quejarse de los permisos.
oseiskar
56

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 realiza una copia de seguridad del registro actual y luego borra el archivo de registro para continuar escribiendo. 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 archivo anterior.Le recomiendo que use copytruncate a menos que sepa que necesita crear. La razón es que Rails puede seguir apuntando al archivo de registro anterior a pesar de que su nombre ha cambiado y pueden requerir reiniciar para ubicar el nuevo archivo de registro. copytruncate evita esto manteniendo el mismo archivo que el archivo activo.

amit_saxena
fuente
¿Pero no debería reiniciar los rieles cada vez que se ejecuta logrotate?
lzap
2
Trunca 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. el archivo de registro anterior para siempre. Tenga en cuenta que hay un intervalo de tiempo muy pequeño entre copiar el archivo y truncarlo, por lo que podrían perderse algunos datos de registro. Cuando se utiliza esta opción, la opción de creación no tendrá efecto, ya que el archivo de registro anterior permanece en su lugar.
lzap
1
No necesita reiniciar los rieles si está utilizando copytruncate porque todavía apunta al mismo archivo de registro.
amit_saxena
¿La configuración requiere que indique cuándo rotar los registros? como "semanal" o "tamaño = 20M"? ¿O puede omitir eso, en caso de que solo quiera ejecutar logrotate manualmente?
Damainman
1
No estoy seguro de haber entendido su pregunta correctamente, pero debe especificar un criterio para la rotación automática de registros. Si no desea que sea automático, no coloque el archivo en el directorio /etc/logrotate.d/, guárdelo en otro lugar. Luego puede ejecutar logrotate --force $CONFIG_FILEespecificando la ubicación del archivo de configuración para ejecutarlo manualmente.
amit_saxena
31

Para Rails 5, esto es lo que tuve que hacer para limitar el tamaño del registro y no cambiar la salida del servidor en la consola:

De acuerdo con la documentación , si desea limitar el tamaño de la carpeta de registro, colóquelo 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 sus preferencias. El '1' en el segundo parámetro significa que se guardará 1 archivo de registro histórico, por lo que tendrá hasta 100Mb de registros: el registro actual y el fragmento anterior de 50Mb.

Fuente de esta solución .

Extraño compañero
fuente
2
El primer argumento es nombre de archivo, simplemente hablando, es decir, 'log / development.log'. Entonces preferiría más tiempo, pero de manera transparente. En lugar de config.paths['log'].firstponerRails.root.join('log', "#{Rails.env}.log")
Mikhail Chuprynski el
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
1
Para que sea más fácil de leer, vale la pena mencionar que puede confiar en las extensiones de bytes de ActiveSupport: 50.megabyteses lo mismo 50 * 1024 * 1024, pero mucho más fácil de entender. Consulte las extensiones principales de ActiveSupport para obtener más detalles.
Pierre-Adrien Buisson
1
Llegué aquí nuevamente después de buscar en Google (vida del programador: D). Me preguntaba si podemos configurar esta línea para rotar todos los archivos de registro en la carpeta de registro. Aparentemente, esta línea solo rotará la primera línea.
Zia Ul Rehman Mughal
Tenga en cuenta que esto solo rotará su archivo log / production.log como Rails.application.config.paths['log'].firstdevolver exactamente este archivo
valachi
5

Para Rails 5 , si desea la rotación diaria de registros, solo necesita esto:

  config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')

De acuerdo con la documentación , puede usar daily, weeklyo monthly.

Rael Gugelmin Cunha
fuente
2

Para cada registro: registro de Rails, registro de Rpush, ... Puede usarlo así 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: solo guardar 1 archivo de registro anterior después de dividir. El tamaño del registro principal nunca supera los 20 MB.

ThienSuBS
fuente
-9

Habilite para enviar registros al loggly utilizando rails logglier como se muestra en mi archivo de entornos / production.rb. la versión de rails 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
riya khana
fuente
Sugierame
La versión de Rails es 4.1.0 y la versión de Ruby es 2.1.1
riya khana