Rotation des journaux de production Ruby on Rails

172

Quelle est la meilleure façon d'activer la rotation des journaux sur une application de production Ruby on Rails?

Est-ce en utilisant logrotate sur le serveur d'hébergement ou existe-t-il un ensemble d'options à utiliser lors de l'initialisation de l'enregistreur à partir de l'application?

cnicolaou
la source
Je vois qu'il y a déjà une réponse à ce sujet, mais je voulais vous demander quel est votre environnement. J'utilise moi-même la méthode syslog + logrotate, mais évidemment le type d'environnement (qu'il soit dédié, partagé; quel type de système d'exploitation * ix héberge, ou en est-il un autre, etc.) aurait une certaine importance ici.
ylluminate le

Réponses:

203

Option 1: syslog + logrotate

Vous pouvez configurer des 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

De cette façon, vous vous connectez à syslog et pouvez utiliser les outils logrotate par défaut pour faire pivoter les journaux.

Option 2: journaux Rails normaux + logrotate

Une autre option consiste simplement à configurer logrotate pour récupérer les journaux laissés par les rails. Sur Ubuntu et Debian, ce serait, par exemple, dans un fichier appelé /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 d'avoir à redémarrer l'application Rails.

Edit: supprimé "sharedscripts / endscript" car ils ne sont pas utilisés ici et posent des problèmes selon le commentaire. Et supprimé create 640 root admselon le commentaire suggéré.

berkes
la source
3
Pour utiliser logrotate, la ligne "config.logger = SyslogLogger.new" dans config / environnements / production.rb doit-elle rester commentée ou doit-elle être décommentée?
robertwbradford
2
Il doit rester commenté, afin que les fichiers journaux soient écrits (par exemple): /var/www/myrailsapp/current/log/production.log
Luca Spiller
3
Si vous utilisez la logrotatesolution, la réponse de @ amit-saxena vaut la peine - suggère l'utilisation de copytruncatesur la createdirective.
Tom Harrison
3
Lorsque vous utilisez copytruncate, createn'a aucun effet, vous devriez donc probablement le supprimer de votre exemple
Michaël Witrant
3
Vous devrez peut-être également ajouter la ligne su your_rails_user your_rails_groupavec le propriétaire et le groupe de vos fichiers journaux (c'est-à-dire ceux du processus Rails / Passenger) ou (versions récentes de?) Logrotate peut se plaindre des autorisations.
oseiskar
56

Si vous utilisez logrotate, vous pouvez choisir l'une des options ci-dessous en plaçant un fichier conf 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 effectue une copie de sauvegarde du journal actuel, puis efface le fichier journal pour continuer à écrire. L'alternative est d'utiliser create qui effectuera la rotation en renommant le fichier actuel puis en créant un nouveau fichier journal avec le même nom que l'ancien fichier. Je vous recommande fortement d'utiliser copytruncate à moins que vous ne sachiez que vous devez créer. La raison en est que Rails peut continuer à pointer vers l'ancien fichier journal même si son nom a changé et qu'il peut être nécessaire de redémarrer pour localiser le nouveau fichier journal. copytruncate évite cela en conservant le même fichier que le fichier actif.

amit_saxena
la source
Mais ne devrais-je pas redémarrer les rails à chaque exécution de logrotate?
lzap le
2
Tronquez le fichier journal d'origine en place après avoir créé une copie, au lieu de déplacer l'ancien fichier journal et éventuellement d'en créer un nouveau, il peut être utilisé lorsqu'un programme ne peut pas être invité à fermer son fichier journal et peut donc continuer à écrire (ajouter) à le fichier journal précédent pour toujours. Notez qu'il y a une très petite tranche de temps entre la copie du fichier et sa troncature, donc certaines données d'enregistrement peuvent être perdues. Lorsque cette option est utilisée, l'option de création n'aura aucun effet, car l'ancien fichier journal reste en place.
lzap le
1
Vous n'avez pas besoin de redémarrer les rails si vous utilisez copytruncate car il pointe toujours vers le même fichier journal.
amit_saxena
La configuration vous oblige-t-elle à indiquer quand faire pivoter les journaux? comme "hebdomadaire" ou "taille = 20M"? Ou pouvez-vous omettre cela, au cas où vous ne souhaiteriez exécuter logrotate que manuellement?
Damainman
1
Je ne sais pas si j'ai bien compris votre question, mais vous devez spécifier un critère pour la rotation automatique des journaux. Si vous ne voulez pas que ce soit automatique, ne mettez pas le fichier dans le répertoire /etc/logrotate.d/, gardez-le ailleurs. Vous pouvez ensuite exécuter logrotate --force $CONFIG_FILEen spécifiant l'emplacement du fichier de configuration pour l'exécuter manuellement.
amit_saxena
31

Pour Rails 5, voici ce que j'ai dû faire pour limiter la taille du journal et ne pas modifier la sortie du serveur dans la console:

Selon la documentation , si vous souhaitez limiter la taille du dossier de journal, placez-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 dépasseront jamais 50 Mo. Vous pouvez modifier la taille selon vos préférences. Le «1» dans le deuxième paramètre signifie qu'un fichier journal historique sera conservé, vous aurez donc jusqu'à 100 Mo de journaux - le journal actuel et le bloc précédent de 50 Mo.

Source de cette solution .

Compagnon étranger
la source
2
Le premier argument est le nom du fichier, en termes simples, c'est-à-dire «log / development.log». Je préférerais donc un moyen plus long, mais transparent. Au lieu de config.paths['log'].firstje Rails.root.join('log', "#{Rails.env}.log")
mettrais
1
@ZiaUlRehmanMughal Oui, cela fonctionne avec Rails 4. J'utilise Rails 4.2.3, avec une configuration comme celle-ci: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS
1
Pour rendre cela plus facile à lire, il convient de mentionner que vous pouvez compter sur les extensions d'octets ActiveSupport: 50.megabytesc'est la même chose 50 * 1024 * 1024, mais beaucoup plus facile à comprendre. Voir les extensions principales d'ActiveSupport pour plus de détails.
Pierre-Adrien Buisson
1
Je suis revenu ici après quelques recherches sur Google (vie de programmeur: D). Je me demandais si nous pouvons configurer cette ligne pour faire pivoter tous les fichiers journaux dans le dossier journal? Apparemment, cette ligne ne tournera que la première ligne.
Zia Ul Rehman Mughal
Notez que cela ne fera que faire pivoter votre fichier journal / production.log car Rails.application.config.paths['log'].firstrenvoyer exactement ce fichier
valachi
5

Pour Rails 5 , si vous voulez une rotation quotidienne des journaux, 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, weeklyou monthly.

Raël Gugelmin Cunha
la source
2

Pour chaque journal: journal Rails, journal Rpush, ... Vous pouvez utiliser comme ceci dans votre fichier de configuration de service:

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

Cela signifie: enregistrez seulement 1 fichier journal précédent après la scission. La taille du journal principal ne dépasse jamais 20 Mo.

ThienSuBS
la source
-9

Activez pour envoyer des journaux à la loggly à l'aide de rails logglier comme suit dans mon fichier environnements / production.rb. la version des rails est 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
la source
S'il vous plaît suggérez-moi quelque chose à faire ... ce code ne fonctionne pas
riya khana
La version de Rails est 4.1.0 et la version de Ruby est 2.1.1
Riya Khana