Gérer les journaux avec logrotate sur Ubuntu 16.04

Comment configurer logrotate pour garder vos journaux système et applicatifs sous contrôle.

Logrotate est un utilitaire système qui gère la rotation automatique, la compression et le nettoyage des fichiers de logs. Sans gestion appropriée, les logs d'un serveur en fonctionnement continu finissent par occuper tout l'espace disque disponible — logrotate vous évite d'en arriver là.

Sur Ubuntu 16.04, logrotate est préinstallé et déjà configuré pour gérer la rotation des logs de l'ensemble des paquets système et des applications.

Vérifier l'installation

logrotate --version

Vous devriez obtenir quelque chose comme :

logrotate 3.8.7

Structure de la configuration

La configuration de logrotate se trouve à deux endroits :

  • /etc/logrotate.conf — le fichier de configuration principal, avec les valeurs par défaut globales et les modèles pour les fichiers non système
  • /etc/logrotate.d/ — un répertoire de fichiers de configuration par service, qui étendent ou écrasent ces valeurs par défaut

Prenons comme exemple la configuration intégrée pour apt :

cat /etc/logrotate.d/apt

Sortie :

/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}

Ce fichier définit les règles de rotation pour term.log et history.log. Toute directive non spécifiée ici hérite des valeurs par défaut globales de /etc/logrotate.conf.

Rôle de chaque directive :

  • rotate 12 — conserver 12 archives avant de supprimer les plus anciennes
  • monthly — effectuer la rotation une fois par mois
  • compress — compresser les logs archivés (gzip par défaut)
  • missingok — ne pas générer d'erreur si le fichier de log est absent
  • notifempty — ignorer la rotation si le fichier de log est vide

Méthode 1 — Ajouter une configuration dans /etc/logrotate.d/

C'est l'approche standard pour la plupart des applications. La configuration s'exécute quotidiennement en tant que root, en même temps que tous les autres jobs logrotate.

Voici un exemple pour une application qui écrit access.log et error.log dans /var/log/example-app/ :

sudo nano /etc/logrotate.d/example-app
/var/log/example-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload example-app
endscript
}

Rôle de chaque directive :

  • create 0640 www-data www-data — créer un nouveau fichier de log vide après la rotation, avec les permissions 0640, appartenant à www-data
  • sharedscripts — exécuter le script postrotate une seule fois après le traitement de tous les fichiers correspondants, plutôt qu'une fois par fichier
  • postrotate ... endscript — commandes à exécuter après la rotation ; dans cet exemple, l'application est rechargée afin qu'elle utilise le nouveau fichier de log

Une fois la configuration en place, testez-la sans appliquer aucune modification :

sudo logrotate /etc/logrotate.conf --debug

Ce mode de simulation affiche le détail de ce que logrotate ferait — rien n'est modifié.

Nos produits et services

Hébergement webFonctionne sur des disques NVMe ultra-rapides. Convient aux sites de toute complexité.
Commande
VPSInfrastructure cloud flexible avec accès root complet.
Commande
Serveurs dédiésServeurs physiques pour une performance maximale.
Commande

Méthode 2 — Configuration personnalisée avec planification cron

Si vous avez besoin d'une rotation selon un calendrier non standard — par exemple toutes les heures — il vaut mieux créer une configuration en dehors de /etc/logrotate.d/ et la déclencher manuellement via cron.

Dans cet exemple, l'application tourne sous l'utilisateur newuser et écrit ses logs dans /home/newuser/logs/. Créez un fichier de configuration local :

nano /home/newuser/logrotate.conf
/home/newuser/logs/*.log {
hourly
missingok
rotate 24
compress
create
}

Cette configuration effectuera la rotation des logs toutes les heures, en conservant 24 archives compressées et en créant un nouveau fichier de log à chaque fois.

Créez le répertoire de logs et un fichier de test :

cd ~
mkdir logs
touch logs/access.log

Lancez logrotate manuellement en lui indiquant un fichier d'état personnalisé :

logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state --verbose --force

Sortie :

reading config file /home/newuser/logrotate.conf
Handling 1 logs
rotating pattern: /home/newuser/logs/*.log  hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/newuser/logs/access.log
log does not need rotating

--verbose affiche le détail de toutes les opérations effectuées par logrotate. --force déclenche la rotation qu'elle soit due ou non. --state indique à logrotate où stocker l'enregistrement de la dernière exécution.

Vérifiez le contenu du fichier d'état :

cat /home/newuser/logrotate-state

Sortie :

logrotate state -- version 2
"/home/newuser/logs/access.log" 2020-05-18-16:0:0

C'est ainsi que logrotate garde la trace de ce qu'il a traité et quand — afin de savoir exactement quoi faire à la prochaine exécution. Lancez la même commande une heure plus tard et le log sera rotaté comme prévu.

Automatisation avec cron

Pour que logrotate s'exécute automatiquement toutes les heures, ajoutez un job cron :

crontab -e

Ajoutez cette ligne à la fin du fichier :

14 * * * * /usr/sbin/logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state

Cette tâche s'exécutera à la 14e minute de chaque heure, tous les jours.

Aide

Une question ou besoin d'un coup de main ? Écrivez-nous via le système de tickets — nous sommes toujours là pour vous aider !

Besoin d’aide?Nos ingénieurs vous aideront gratuitement pour n’importe quelle question en quelques minutesNous contacter