Nous utilisons upstart pour gérer nos services sur nos serveurs Ubuntu. Ils produisent des journaux qui sont déconnectés de /var/log/upstart/SERVICE_NAME.log
Ensuite, chaque jour, les fichiers journaux sont pivotés à l'aide du script logrotation fourni avec 12.04 LTS:
/var/log/upstart/*.log {
daily
missingok
rotate 7
compress
notifempty
nocreate
}
Le problème est que, bien que logrotate déplace les fichiers, il ne semble pas indiquer à Upstart de fermer et de rouvrir les fichiers, laissant le processus Upstart en écriture sur un PID de suppression.
init 1 root 8w REG 202,1 64 2431 /var/log/upstart/dbus.log.1 (deleted)
init 1 root 13w REG 202,1 95 2507 /var/log/upstart/acpid.log.1 (deleted)
init 1 root 14w REG 202,1 127 17377 /var/log/upstart/whoopsie.log.1 (deleted)
init 1 root 36w REG 202,1 122 6747 /var/log/upstart/SERVICE_NAME.log.1 (deleted)
init 1 root 37w REG 202,1 30 6762
Évidemment, je pouvais rediriger la sortie de mes propres services vers d'autres fichiers journaux, mais le problème persisterait pour les processus système. De plus, je préférerais ne pas avoir à construire plus d'infrastructures que ce dont j'ai besoin.
Je crois que vous avez 3 options.
Vous modifiez la configuration existante en ajoutant "copytruncate"
/var/log/upstart/*.log { copytruncate daily missingok rotate 7 compress notifempty nocreate }
Si vous ne pouvez pas ou (n'êtes pas autorisé (e)) à modifier la configuration existante de logrotate en raison d'autres fichiers journaux qui ne souffrent pas et que la configuration existante fonctionne pour eux, déplacez vos fichiers "SERVICE_NAME.log" dans un nouveau dossier sous/var/log si vous le souhaitez, créez une nouvelle configuration avec "copytruncate" et ajoutez-la au fichier cron.daily.
a) Si vous n'êtes pas autorisé à modifier la configuration de l'hôte OS ou à l'ajouter au fichier cron.daily de l'OS hôte, votre troisième option consiste à modifier les scripts ou les programmes afin de vérifier que le fichier existe avant d'écrire dans le fichier. b) Un autre moyen est un peu le point 2 ci-dessus qui consiste à déplacer vos fichiers journaux ailleurs et dans votre script ou programme, exécutez la commande logrotate spécifique au fichier journal de ce programme.
Le point 3b ci-dessus est plus délicat mais plus élégant et c'est ce que j'utilise le plus souvent car cela signifie que le programme est autonome et autogéré et qu'il n'a pas besoin des tâches du système d'exploitation pour le garder.
Pour savoir comment exécuter manuellement logrotate et l'ajouter à votre programme ou script, tapez simplement:
man logrotate
ou
logrotate --help
Si vous utilisez Python pour vos programmes, vous pouvez vérifier comment ce programme l’utilise pour gérer lui-même ses fichiers journaux. http://Bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/
Il s’avère que c’est un problème connu et que le ticket reste ouvert tant que je tape ceci.
La bonne chose à faire est probablement de simplement supprimer le /etc/logrotate.d/upstart
et de faire pivoter les fichiers de chaque service individuellement. Parce que le répertoire (/var/log/upstart/
) contient uniquement le stdout/stderr des différents services - et aucun service destiné à être exécuté en tant que démon ne devrait être la sortie à ces deux canaux du tout. Sauf peut-être au tout début.
Sur les systèmes que je gère, trois services sont gérés par upstart: php5.6-fpm
, php7.1-fpm
et acpid
. Aucun des trois journaux n'est actif, mais parfois fpm est redémarré en raison de la rotation de son fichier journal principal (/var/log/php5.6-fpm.log
) - ce qui provoque ce bruit, car il génère une certaine inanité au démarrage.
Si vous insistez malgré tout pour faire tourner ces fichiers, vous pouvez vous fier au fait que leurs noms correspondent aux noms des services et utilisez le script postrotate
suivant:
postrotate
service=${1##*/}
service=${service%.log*}
service $service restart > /dev/null
endscript
Pour que ce qui précède fonctionne, assurez-vous de ne pas utiliser le verbe dedans - mon scriptlet s'appuie sur le fait, le chemin d'accès au fichier lui sera transmis comme premier argument (sharedscripts
$1
).
(La redirection dans /dev/null
est utile, car la commande service
- est bruyante - et vous ne voulez pas qu'un tel bruit vous soit envoyé par cron. Notez que je ne redirige pas stderr
ici, seulement stdout
- en cas de problème, vous recevrez toujours votre courrier électronique à ce sujet.)