web-dev-qa-db-fra.com

Ruby sur Rails rotation du journal de production

Quel est le meilleur moyen d'activer la rotation des journaux sur une Ruby sur Rails de production?)?

Utilisez-vous logrotate sur le serveur d'hébergement ou existe-t-il un ensemble d'options à utiliser lors de l'initialisation de l'enregistreur depuis l'application?

165
cnicolaou

Option 1: syslog + logrotate

Vous pouvez configurer Rails pour utiliser les outils de journalisation des systèmes.

Un exemple dans config/environnements/production.rb.

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

Ainsi, vous vous connectez à syslog et pouvez utiliser les outils logrotate par défaut pour faire pivoter les journaux.

Option 2: normal Rails journaux + logrotate

Une autre option consiste à configurer simplement logrotate pour récupérer les journaux laissés par Rails. Sur Ubuntu et Debian, ce serait, par exemple, dans un fichier nommé /etc/logrotate.d/Rails_example_com.

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

Selon les suggestions ci-dessous, dans Rails, il est conseillé d’utiliser copytruncate, pour éviter de devoir redémarrer l’application Rails app.

Edit: suppression de "sharedscripts/endscript" puisqu'ils ne sont pas utilisés ici et posent des problèmes en fonction des commentaires. Et enlevé create 640 root adm selon le commentaire suggéré.

200
berkes

Si vous utilisez logrotate, vous pouvez choisir l’une des options présentées ci-dessous en plaçant un fichier de configuration dans le répertoire /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
}

Ou

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

Veuillez noter que copytruncate crée une copie de sauvegarde du journal actuel, puis efface le fichier journal pour poursuivre l’écriture. L'alternative consiste à utiliser create qui effectuera la rotation en renommant le fichier actuel, puis en créant un nouveau fichier journal portant le même nom que l'ancien fichier. Je recommande fortement d'utiliser copytruncate sauf si vous savez que vous devez créer. La raison en est que Rails peut toujours continuer à pointer sur l'ancien fichier journal même si son nom a changé et qu'il peut être nécessaire de le redémarrer pour localiser le nouveau fichier journal. Copytruncate évite cela en conservant le même fichier en tant que fichier actif.

55
amit_saxena

Pour Rails 5, voici ce que je devais faire pour limiter la taille du journal et ne pas modifier la sortie du serveur dans la console:

Selon la documentation , si vous voulez limiter la taille du dossier du journal, mettez-le dans votre fichier d'environnement ('development.rb'/'production.rb').

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

Avec cela, vos fichiers journaux ne deviendront jamais plus grands que 50 Mo. Vous pouvez modifier la taille selon vos préférences. Le "1" dans le deuxième paramètre signifie que 1 fichier de journal historique sera conservé, de sorte que vous aurez jusqu’à 100 Mo de journaux - le journal actuel et le bloc précédent de 50 Mo.

Source de cette solution .

28
Fellow Stranger

Pour chaque journal: Rails journal, journal Rpush, ... Vous pouvez utiliser cette méthode dans votre fichier de configuration du service:

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

Cela signifie: ne sauvegarder qu'un fichier journal précédent après la scission. La taille du journal principal ne dépasse jamais 20 Mo.

1
ThienSuBS

Si vous voulez une rotation journalière des journaux, sur Rails 5, vous n’avez besoin que de ceci:

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

Selon la documentation , vous pouvez utiliser daily, weekly ou monthly.

1