web-dev-qa-db-fra.com

Pourquoi est-ce que seulement certains de mes journaux sont soumis à une rotation?

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
4
Dave

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 ...

0
Tom Spurling

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.

1
Arronical

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.

0
v_sukt