J'utilise Ubuntu 14.04. J'ai les éléments suivants dans mon fichier /etc/logrotate.conf ...
/home/Rails/myproject/log {
daily
rotate 3
compress
delaycompress
missingok
notifempty
create 644 Rails rails
}
/var/log/postgresql {
daily
rotate 3
compress
delaycompress
missingok
notifempty
create 644 root root
}
Chaque nuit, je regardais mes Rails bûches et elles étaient toujours plus grandes - c’est-à-dire qu’il ne semblait pas y avoir de rotation des bûches ...
myuser@myproject:~$ ls -al /home/Rails/myproject/log
total 4574368
drwxr-xr-x 2 Rails rails 4096 May 30 12:04 .
drwxr-xr-x 15 Rails rails 4096 May 30 12:03 ..
-rw-rw-r-- 1 Rails rails 14960 Jun 1 22:39 development.log
-rw-rw-r-- 1 Rails rails 0 Oct 22 2016 .keep
-rw-r--r-- 1 Rails rails 4523480004 Jun 22 10:19 production.log
-rw-rw-r-- 1 Rails rails 156358087 Jun 22 10:19 sidekiq.log
-rw-rw-r-- 1 Rails rails 54246 Apr 10 14:34 test.log
Lorsque je lance la commande manuellement, je constate que certains journaux semblent faire l'objet d'une rotation ...
myuser@myproject:~$ Sudo logrotate /etc/logrotate.conf
myuser@myproject:~$ ls -al /home/Rails/myproject/log
total 4570288
drwxr-xr-x 2 Rails rails 4096 Jun 22 10:22 .
drwxr-xr-x 15 Rails rails 4096 May 30 12:03 ..
-rw-rw-r-- 1 Rails rails 0 Jun 22 10:22 development.log
-rw-rw-r-- 1 Rails rails 14960 Jun 1 22:39 development.log.1
-rw-rw-r-- 1 Rails rails 0 Oct 22 2016 .keep
-rw-r--r-- 1 Rails rails 0 Jun 22 10:22 production.log
-rw-r--r-- 1 Rails rails 4523505906 Jun 22 10:23 production.log.1
-rw-rw-r-- 1 Rails rails 156369048 Jun 22 10:23 sidekiq.log
-rw-rw-r-- 1 Rails rails 54246 Apr 10 14:34 test.log
Comment comprendre pourquoi mes Rails journaux ne sont pas soumis à une rotation nocturne? Notez que les autres journaux du système semblent l'être. Ci-dessus, j'ai inclus ma configuration postgres, et quand je regarde les journaux là-bas, semble tourner normalement ...
myuser@myproject:~$ ls -al /var/log/postgresql
total 1832
drwxrwxr-t 2 root postgres 4096 May 2 20:42 .
drwxr-xr-x 13 root root 4096 Jun 22 10:22 ..
-rw-r----- 1 postgres adm 1861361 Jun 22 10:14 postgresql-9.6-main.log
Merci, Dave
Modifier: Mettre la configuration dans un fichier séparé ne semblait rien faire. Vous trouverez ci-dessous ma configuration et les journaux qui ne semblaient pas faire l'objet d'une rotation ...
myuser@myapp:~$ Sudo cat /etc/logrotate.d/myapp
[Sudo] password for myuser:
/home/Rails/myapp/log/*.log {
daily
missingok
compress
notifempty
rotate 12
create
delaycompress
missingok
su Rails rails
}
Voici les journaux. Ne semble pas que quelque chose s'est passé ...
myuser@myapp:~$ ls -al /home/Rails/myapp/log
total 4635956
drwxr-xr-x 2 Rails rails 4096 Jun 22 10:22 .
drwxr-xr-x 15 Rails rails 4096 May 30 12:03 ..
-rw-rw-r-- 1 Rails rails 0 Jun 22 10:22 development.log
-rw-rw-r-- 1 Rails rails 14960 Jun 1 22:39 development.log.1
-rw-rw-r-- 1 Rails rails 0 Oct 22 2016 .keep
-rw-r--r-- 1 Rails rails 0 Jun 22 10:22 production.log
-rw-r--r-- 1 Rails rails 4546785231 Jun 24 12:12 production.log.1
-rw-rw-r-- 1 Rails rails 200336693 Jun 24 12:51 sidekiq.log
-rw-rw-r-- 1 Rails rails 54246 Apr 10 14:34 test.log
Le travail de Logrotate consiste à déplacer (renommer) et à compresser des fichiers. Dans ce cas, vous l'avez configuré pour renommer et compresser les fichiers journaux Rails, puis en créer de nouveaux avec les noms d'origine.
Les noms de fichiers sont un moyen de rechercher un fichier, mais le fichier lui-même ne représente que de l’espace sur le disque. Un fichier peut avoir plusieurs noms (liens physiques) ou aucun nom (vous pouvez rm
un fichier ouvert, mais cela prend toujours de la place sur le disque tant que le fichier est ouvert dans certains processus).
Le problème que vous semblez avoir ici est que l'application Rails a déjà ouvert le fichier lorsqu'il a été renommé. L'enregistreur Rails ne remarque pas le changement de nom car il a utilisé le nom une fois pour ouvrir le fichier, puis a complètement cessé de se soucier de son nom. L'enregistreur a juste une poignée sur le fichier ouvert.
Vous devez le persuader de fermer et de rouvrir les fichiers journaux, en utilisant à nouveau leurs noms, ce qui signifie qu'il commence à écrire dans les nouveaux fichiers vides, qui portent désormais le même nom que les anciens.
Si vous jetez un œil à /etc/logrotate.d
, vous en verrez de nombreux exemples, en fonction de ce que vous avez installé.
Par exemple, rsyslog a:
postrotate
invoke-rc.d rsyslog rotate > /dev/null
endscript
stunnel a:
postrotate
/etc/init.d/stunnel4 reopen-logs > /dev/null
endscript
Ce sont des scripts qui indiquent au processus pertinent que le fichier doit être rouvert. Le mécanisme spécifique dépend du programme, mais cela tend généralement à envoyer un HUP
(ou parfois USR1
) (voir man 7 signal
), que les processus longs exécutent en tant qu'instruction fermer et rouvrir les fichiers de log.
Dans le cas de Rails, la façon de le faire varie en fonction de l'enregistreur utilisé. Je viens de voir un conseil qui suggère que vous utilisiez copytruncate
qui est fondamentalement une "option de triche" dans logrotate lui indiquant de copier manuellement le contenu et de vider le fichier plutôt que de le déplacer et d'en créer un nouveau. (voir man logrotate.conf
). Ceci est utilisé à la place de create
comme ceci:
/home/Rails/myapp/log/*.log {
daily
missingok
compress
notifempty
rotate 12
copytruncate
delaycompress
missingok
su Rails rails
}
Ce n’est pas une bonne solution car il faut littéralement copier le fichier entier (pour en créer un instantané tel quel) avant de supprimer son contenu, ce qui est assez inefficace.
Toutefois, si vous utilisez nicorn pour exécuter votre application (qui multiplexe les demandes sur un tas de processus de travail identiques Rails, il prend en charge le signal USR1 normalement (tuer et remplacer tous les fichiers). les ouvriers, ce qui les amène effectivement à rouvrir les fichiers) et vous pouvez simplement l’envoyer dans un fichier postrotate en utilisant pkill
ou similaire, peut-être comme ceci:
/home/Rails/myapp/log/*.log {
daily
missingok
compress
notifempty
rotate 12
create
delaycompress
missingok
su Rails rails
postrotate
pkill -USR1 -u Rails Unicorn
endscript
}
pkill
est un outil qui permet de rechercher des processus en cours et de leur envoyer des signaux. Le nom Unicorn
est alors lancé en tant qu'utilisateur Rails
et lui est envoyé le signal USR1
. lui dit de rouvrir les fichiers journaux. (Les exemples que j'ai donnés à partir des fichiers /etc/logrotate.d
des paquets Ubuntu font en réalité la même chose, mais ces services ont la recherche cachée dans des fonctions dans leurs scripts /etc/init.d
.)
Je suis sûr qu'il y aura moyen de configurer une postrotate
raisonnable pour tout type de configuration Rails (dans le cas le plus simple et le plus facile, redémarrez-le simplement), mais j'espère que cela explique le côté Ubuntu des choses quand même ...
Il semble que le problème réside dans le fait que vous spécifiez un répertoire pour la rotation de fichier, au lieu des noms de fichier réels. Les fichiers de configuration de logrotate acceptent les caractères génériques pour la globbing (filtrage par motif).
Pour faire pivoter tous les fichiers portant l’extension .log
dans votre répertoire /home/Rails/myproject/log
, vous pouvez utiliser la ligne suivante à la place de la première ligne de votre configuration:
/home/Rails/myproject/log/*.log {
et de même dans la configuration de l'annuaire postgres
/var/log/postgresql/*.log {
Il est possible d'utiliser le caractère générique *
sans l'extension .log
pour faire pivoter tous les fichiers (sauf les fichiers cachés commençant par .
) dans votre répertoire postgresql, mais je préfère le contrôle supplémentaire de la spécification. .log
fichiers uniquement:
/var/log/postgresql/* {
Notez également que vous créez de nouvelles versions du fichier journal avec logrotate. Si vous créez le nouveau journal postgresql avec des autorisations 644 octales, appartenant à l'utilisateur root, l'utilisateur postgres ne pourra pas écrire dans le répertoire. nouveau fichier journal.
Vérifiez l'état dans /var/lib/logrotate/status
si des problèmes apparaissent
Vérifiez les autorisations et les droits de propriété sur les fichiers du propriétaire /etc/logrotate.d root et du mode d’autorisation 644. Extrait de code pour logrotate:
/home/Rails/myapp/log/*.log {
rotate 12
daily
missingok
compress
notifempty
create 640 Rails rails
delaycompress
missingok
}
vérifiez la sortie logrotate par une exécution manuelle avec --verbose
Si vous avez besoin d'une logrotation supérieure à une taille spécifique, vous pouvez expérimenter avec les options maxsize
et size
du fichier de configuration logrotate.