Faire pivoter et archiver les journaux avec la commande Linux logrotate

Les journaux sont parfaits pour découvrir ce que fait une application ou pour résoudre un problème éventuel. Presque toutes les applications que nous traitons génèrent des journaux, et nous voulons que les applications que nous développons nous-mêmes les génèrent également. Plus les journaux sont détaillés, plus nous avons d’informations. Mais laissés à eux-mêmes, les bûches peuvent atteindre une taille ingérable et devenir à leur tour un problème. C’est donc une bonne idée de les réduire, de garder ceux dont nous aurons besoin et d’archiver le reste.
Notions de base
Les logrotate
l’utilitaire est excellent pour gérer les journaux. Il peut les faire pivoter, les compresser, les envoyer par e-mail, les supprimer, les archiver et en créer de nouveaux lorsque vous en avez besoin.
Fonctionnement logrotate
est assez simple – il suffit de lancer logrotate -vs state-file config-file
. Dans la commande ci-dessus, le v
l’option active le mode verbeux, s
spécifie un fichier d’état, et la finale config-file
mentionne le fichier de configuration, où vous spécifiez ce que vous devez faire.
Pratique
Voyons un logrotate
configuration qui s’exécute silencieusement sur notre système, gérant la richesse des journaux que nous trouvons dans le /var/log
annuaire. Vérifiez les fichiers actuels dans ce répertoire. Voyez-vous beaucoup de *.[number].gz
des dossiers? C’est ce que logrotate
fait. Vous pouvez trouver le fichier de configuration pour cela sous /etc/logrotate.d/rsyslog
. Le mien ressemble à ça :
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
Le fichier commence par définir les instructions de rotation du /var/log/syslog
fichier et les instructions sont contenues dans les accolades qui suivent. Voici ce qu’ils signifient :
rotate 7
: Conservez les journaux des sept dernières rotations. Ensuite, commencez à les supprimer.daily
: Faites pivoter le journal quotidiennement. De même querotate 7
, cela signifierait que les journaux seraient conservés pour les sept derniers jours. D’autres options sontweekly
,monthly
,yearly
. Il y a aussisize
paramètre qui fera tourner les fichiers journaux si leur taille augmente au-delà d’une limite spécifiée, par exemple,size 10k
,size 10M
,size 10G
, etc. Si rien n’est spécifié, les journaux seront tournés chaque fois quelogrotate
s’exécute. Tu peux même courirlogrotate
dans uncron
de l’utiliser à des intervalles de temps plus précis.missingok
: Ce n’est pas grave si le fichier journal est manquant. Ne paniquez pas.notifempty
: Ne pas effectuer de rotation si le fichier journal est vide.delaycompress
: Si la compression est activée, retardez la compression jusqu’à la prochaine rotation. Cela permet la présence d’au moins un fichier pivoté mais non compressé. Utile si vous souhaitez que les journaux d’hier restent non compressés pour le dépannage. Il est également utile si un programme peut encore écrire dans l’ancien fichier jusqu’à ce qu’il soit redémarré/rechargé, comme Apache.compress
: La compression est activée. Utilisationnocompress
pour l’éteindre.postrotate/endscript
: exécutez le script dans cette section après la rotation. Utile pour faire des trucs de nettoyage. Il y a aussiprerotate/endscript
pour faire les choses avant le début de la rotation.
Pouvez-vous comprendre ce que fait la section suivante pour tous les fichiers mentionnés dans la configuration ci-dessus ? Le seul paramètre supplémentaire dans la deuxième section est sharedscripts
, qui raconte logrotate
pour ne pas exécuter la section dans postrotate/endscript
jusqu’à ce que toute la rotation des journaux soit terminée. Il empêche l’exécution du script pour chaque journal tourné et s’exécute une fois à la fin.
Quelque chose de nouveau
J’utilise la configuration suivante pour gérer les accès Nginx et les journaux d’erreurs sur mon système.
/var/log/nginx/access.log
/var/log/nginx/error.log {
size 1
missingok
notifempty
create 544 www-data adm
rotate 30
compress
delaycompress
dateext
dateformat -%Y-%m-%d-%s
sharedscripts
extension .log
postrotate
service nginx reload
endscript
}
Le script ci-dessus peut être exécuté en utilisant :
logrotate -vs state-file /tmp/logrotate
L’exécution de la commande pour la première fois donne cette sortie :
reading config file /tmp/logrotate
extension is now .logHandling 1 logs
rotating pattern: /var/log/nginx/access.log
/var/log/nginx/error.log 1 bytes (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
log needs rotating
considering log /var/log/nginx/error.log
log does not need rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 30
Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
dateext suffix '-2021-08-27-1485508250'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508250.log
creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
running postrotate script
* Reloading nginx configuration nginx
Et en l’exécutant une seconde fois :
reading config file /tmp/logrotate
extension is now .logHandling 1 logs
rotating pattern: /var/log/nginx/access.log
/var/log/nginx/error.log 1 bytes (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
log needs rotating
considering log /var/log/nginx/error.log
log does not need rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 30
Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
dateext suffix '-2021-08-27-1485508280'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508280.log
creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
running postrotate script
* Reloading nginx configuration nginx
Et en l’exécutant une troisième fois :
reading config file /tmp/logrotate
extension is now .logHandling 1 logs
rotating pattern: /var/log/nginx/access.log
/var/log/nginx/error.log 1 bytes (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
log needs rotating
considering log /var/log/nginx/error.log
log does not need rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 30
Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
dateext suffix '-2021-08-27-1485508316'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508316.log
creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
running postrotate script
* Reloading nginx configuration nginx
Le contenu du fichier d’état ressemble à ceci :
logrotate state -- version 2
"/var/log/nginx/error.log" 2021-08-27-9:0:0
"/var/log/nginx/access.log" 2021-08-27-9:11:56
Téléchargez l’aide-mémoire Linux logrotate.
Cet article a été initialement publié sur le blog personnel de l’auteur et a été adapté avec permission.