Comment gérer les fichiers journaux avec Logrotate sur Ubuntu 22.04

Introduction

Logrotate est un utilitaire système qui gère la rotation automatique et la compression des fichiers journaux. Si les fichiers journaux n’étaient pas rotatés, compressés et périodiquement élagués, ils pourraient éventuellement consommer tout l’espace disque disponible sur un système.

Logrotate est installé par défaut sur Ubuntu 22.04 et est configuré pour gérer les besoins de rotation des journaux de tous les paquets installés, y compris rsyslog, le processeur de journal système par défaut.

Dans cet article, nous explorerons la configuration par défaut de Logrotate, puis configurerons la rotation des journaux pour une application personnalisée fictive.

Prérequis

Ce tutoriel suppose que vous disposez d’un serveur Ubuntu 22.04, avec un utilisateur sudo non root activé, comme décrit dans Configuration initiale du serveur avec Ubuntu 22.04.

Logrotate est disponible sur de nombreuses autres distributions Linux également, mais la configuration par défaut peut être assez différente. Les autres sections de ce tutoriel s’appliqueront toujours tant que votre version de Logrotate est similaire à celle d’Ubuntu 22.04. Suivez l’étape 1 pour déterminer votre version de Logrotate.

Connectez-vous à votre serveur en tant qu’utilisateur activé sudo pour commencer.

Étape 1 — Confirmation de votre version de Logrotate

Logrotate est installé par défaut sur Ubuntu. Cependant, si vous devez l’installer, exécutez les commandes suivantes pour mettre à jour votre liste de paquets et récupérer le paquet :

  1. sudo apt update
  2. sudo apt install logrotate

Si vous utilisez un serveur non-Ubuntu, assurez-vous d’abord que Logrotate est installé en demandant ses informations de version :

  1. logrotate --version
Output
logrotate 3.19.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status ACL support: yes SELinux support: yes

Si Logrotate est installé mais que le numéro de version est significativement différent, vous pourriez rencontrer des problèmes avec certaines des options de configuration qui sont explorées dans ce tutoriel. Référez-vous à la documentation pour votre version spécifique de Logrotate en lisant sa page manuel (man) :

  1. man logrotate

Vous pouvez également consulter la version en ligne de la documentation de Logrotate. Ensuite, nous examinerons la structure de configuration par défaut de Logrotate sur Ubuntu.

Étape 2 — Exploration de la configuration de Logrotate

Les informations de configuration de Logrotate peuvent généralement être trouvées à deux endroits sur Ubuntu :

  • /etc/logrotate.conf : ce fichier contient quelques paramètres par défaut et configure la rotation pour quelques journaux qui ne sont pas possédés par des paquets système. Il utilise également une instruction include pour importer la configuration depuis n’importe quel fichier dans le répertoire /etc/logrotate.d.
  • /etc/logrotate.d/ : c’est là que tous les paquets que vous installez et qui ont besoin d’aide pour la rotation des journaux placeront leur configuration Logrotate. Sur une installation standard, vous devriez déjà avoir des fichiers ici pour les outils système principaux comme apt, dpkg, rsyslog, etc.

Par défaut, logrotate.conf configurera des rotations de journaux hebdomadaires, avec des fichiers journaux appartenant à l’utilisateur root et au groupe syslog, avec quatre fichiers journaux conservés à la fois (rotate 4), et de nouveaux fichiers journaux vides étant créés après que l’actuel a été tourné (create).

Jetons un coup d’œil au fichier de configuration Logrotate d’un paquet dans /etc/logrotate.d. cat le fichier pour l’utilitaire de paquet apt:

  1. cat /etc/logrotate.d/apt
Output
/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }

Ce fichier contient des blocs de configuration pour deux fichiers journaux différents dans le répertoire /var/log/apt/ : term.log et history.log. Ils ont tous les deux les mêmes options. Toutes les options non définies dans ces blocs de configuration hériteront des valeurs par défaut ou de celles définies dans /etc/logrotate.conf. Toute configuration dans un fichier logrotate remplacera les valeurs par défaut de logrotate, qui sont configurées dans /etc/logrotate.conf. Les options définies pour les journaux apt sont :

  • rotate 12: conserver douze anciens fichiers journaux. Cela remplace le rotate 4 par défaut.
  • monthly: rotation une fois par mois. Cela remplace le weekly par défaut.
  • compress: compresser les fichiers rotatifs. Cela utilise gzip par défaut et donne des fichiers se terminant par .gz. La commande de compression peut être modifiée en utilisant l’option compresscmd.
  • missingok: ne pas écrire de message d’erreur si le fichier journal est manquant.
  • notifempty: ne pas faire tourner le fichier journal s’il est vide.

Ces fichiers de configuration héritent également du comportement create par défaut, ce qui indique à Logrotate de créer de nouveaux journaux après rotation. Cela pourrait être remplacé par nocreate, bien que cela désactiverait effectivement la plupart des autres fonctionnalités.

Il existe de nombreuses autres options de configuration disponibles. Vous pouvez en lire davantage sur toutes en tapant man logrotate sur la ligne de commande pour afficher la page de manuel de Logrotate.

Ensuite, nous allons configurer un fichier de configuration pour gérer les journaux d’un service fictif appelé your-app.

Étape 3 — Configuration d’un exemple

Pour gérer les fichiers journaux à l’aide de logrotate pour des applications en dehors des services système pré-emballés et pré-configurés, nous avons deux options :

  1. Créez un nouveau fichier de configuration Logrotate et placez-le dans /etc/logrotate.d/. Celui-ci sera exécuté quotidiennement en tant qu’utilisateur root ainsi que tous les autres travaux standard de Logrotate.
  2. Créez un nouveau fichier de configuration et exécutez-le en dehors de la configuration Logrotate par défaut d’Ubuntu. Ceci est vraiment nécessaire uniquement si vous devez exécuter Logrotate en tant qu’utilisateur non root, ou si vous souhaitez faire tourner les journaux de manière plus fréquente que tous les jours (une configuration hourly dans /etc/logrotate.d/ serait inefficace, car la configuration Logrotate du système ne s’exécute qu’une fois par jour).

Examinons ces deux options avec quelques exemples de configurations.

Ajout de la configuration à /etc/logrotate.d/

Nous voulons configurer la rotation des journaux pour un serveur web fictif qui place un fichier access.log et error.log dans /var/log/your-app/. Il s’exécute en tant qu’utilisateur et groupe www-data.

Pour ajouter une configuration pour les fichiers journaux de your-app dans /etc/logrotate.d/, ouvrez d’abord un nouveau fichier dans le répertoire /etc/logrotate.d à l’aide de nano ou de votre éditeur préféré:

  1. sudo nano /etc/logrotate.d/your-app

Ajoutez les lignes suivantes à votre nouveau fichier de configuration:

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

Certaines des nouvelles directives de configuration de ce fichier sont:

  • create 0640 www-data www-data: cela crée un nouveau fichier journal vide après la rotation, avec les autorisations spécifiées (0640), le propriétaire (www-data), et le groupe (également www-data).
  • sharedscripts: ce drapeau signifie que tout script ajouté à la configuration est exécuté une seule fois par exécution, au lieu de pour chaque fichier rotatif. Comme le chemin /var/log/your-app/*.log inclut un joker *, cette configuration correspondrait à un nombre quelconque de fichiers journaux dans le répertoire your-app. Sans l’option sharedscripts, le script spécifié dans postrotate s’exécuterait à chaque fois que logrotate traite un fichier journal sans cette option.
  • postrotate à endscript: ce bloc contient un script à exécuter après la rotation du fichier journal. Dans ce cas, nous rechargeons notre exemple d’application. C’est parfois nécessaire pour que votre application bascule vers le fichier journal nouvellement créé.
    Notez que postrotate s’exécute avant la compression des journaux. La compression peut prendre un certain temps, et votre logiciel doit basculer vers le nouveau fichier journal immédiatement. Pour les tâches qui doivent s’exécuter après la compression des journaux, utilisez plutôt le bloc lastaction.

Pour enregistrer et quitter nano, appuyez sur Ctrl+X, puis, lorsque vous y êtes invité, sur Y, puis sur Entrée. Vous pouvez tester le fichier de configuration en effectuant un essai à vide:

  1. sudo logrotate /etc/logrotate.conf --debug

Cette commande appelle logrotate, lui indique le fichier de configuration standard, et active le mode de débogage.

Les informations seront imprimées sur les fichiers journaux que Logrotate gère et ce qu’il aurait fait avec eux. Si tout semble bon, vous avez terminé. Le travail standard de Logrotate s’exécutera une fois par jour et inclura votre nouvelle configuration.

Ensuite, nous allons essayer une configuration qui n’utilise pas du tout la configuration par défaut d’Ubuntu.

Étape 4 — Création d’une Configuration Indépendante pour Logrotate

Dans cet exemple, nous avons une application qui s’exécute sous notre utilisateur sammy, générant des journaux qui sont stockés dans /home/sammy/logs/. Nous voulons faire tourner ces journaux toutes les heures, donc nous devons le configurer en dehors de la structure /etc/logrotate.d fournie par Ubuntu.

Tout d’abord, nous allons créer un fichier de configuration dans notre répertoire personnel. Ouvrez-le dans un éditeur de texte :

  1. nano /home/sammy/logrotate.conf

Ensuite, collez la configuration suivante :

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

Enregistrez et fermez le fichier. Nous avons rencontré toutes ces options dans les étapes précédentes, mais résumons : cette configuration fera tourner les fichiers toutes les heures, les compressant et conservant vingt-quatre anciens journaux, et créant un nouveau fichier journal pour remplacer celui qui a été tourné.

Vous devrez personnaliser la configuration selon votre application, mais c’est un bon début.

Pour tester que la configuration fonctionne, créons un fichier journal. Tout d’abord, cd vers le répertoire personnel de l’utilisateur en utilisant la commande cd ~. Ensuite, créez un répertoire pour les journaux en utilisant la commande mkdir. Enfin, créez un fichier vide dans le répertoire logs en utilisant la commande touch. Exécutez les commandes suivantes dans l’ordre pour compléter ces étapes:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

Maintenant que nous avons un fichier journal vide au bon endroit, exécutons la commande logrotate.

Comme les journaux appartiennent à sammy, nous n’avons pas besoin d’utiliser sudo. Cependant, nous devons spécifier un fichier state. Ce fichier enregistre ce que logrotate a trouvé et les actions qu’il a prises la dernière fois qu’il s’est exécuté, afin de savoir quoi faire la prochaine fois qu’il s’exécute. Ce suivi de l’état est géré pour nous lors de l’utilisation de la configuration par défaut /etc/logrotate.conf. Le fichier d’état est stocké dans /var/lib/logrotate/status. Comme nous n’utilisons pas la configuration par défaut, nous devrons configurer manuellement l’emplacement du fichier d’état.

Nous allons demander à Logrotate de placer le fichier d’état directement dans notre répertoire personnel pour cet exemple. Il peut être placé n’importe où où c’est accessible et pratique. Exécutez la commande suivante pour utiliser le /home/sammy/logrotate.conf que vous avez créé et pour enregistrer l’état que logrotate rencontre:

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

Le drapeau --verbose affichera des informations détaillées sur ce que Logrotate est en train de faire. Dans ce cas, il n’a pas effectué de rotation. C’est la première fois que Logrotate rencontre ce fichier journal et il a zéro heure, donc il ne devrait pas être tourné.

Si nous examinons le fichier d’état à l’aide de l’utilitaire cat, nous remarquerons que Logrotate a enregistré quelques informations sur l’exécution :

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

Logrotate a noté les journaux qu’il a vus et quand il les a considérés pour la rotation. Si nous exécutons cette même commande une heure plus tard, le journal sera tourné comme prévu.

Si vous souhaitez forcer Logrotate à faire tourner le fichier journal alors qu’il ne l’aurait pas fait autrement, utilisez le drapeau --force:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

Ceci est utile lors de la mise en œuvre de postrotate et d’autres scripts.

Enfin, nous devons configurer une tâche cron pour exécuter Logrotate toutes les heures. Ouvrez la crontab de votre utilisateur :

  1. crontab -e

Cela ouvrira un fichier texte. S’il s’agit de votre première utilisation de cron, vous pouvez être invité à choisir un éditeur de texte par défaut. Si vous n’avez pas de préférence, nous recommandons nano aux nouveaux utilisateurs. Il peut y avoir déjà des commentaires dans le fichier qui expliquent la syntaxe cron. Déplacez le curseur vers une nouvelle ligne vierge à la fin du fichier et ajoutez ce qui suit :

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

Cette tâche s’exécutera à la 14e minute de chaque heure, chaque jour. Elle exécute presque la même commande logrotate que celle que nous avons exécutée précédemment, bien que nous ayons étendu logrotate à son chemin complet de /usr/sbin/logrotate pour plus de sécurité. Il est bon usage d’utiliser des chemins complets lors de l’écriture de tâches cron. Pour en savoir plus sur cron, vous pouvez consulter nos autres tutoriels.

Enregistrez le fichier et quittez. Cela installera la crontab et notre tâche s’exécutera selon le calendrier spécifié.

Si nous revisitons notre répertoire de journaux dans environ une heure, nous devrions trouver le fichier journal rotatif et compressé access.log.1.gz (ou .2.gz si vous avez exécuté Logrotate avec le drapeau --force).

Conclusion

Dans ce tutoriel, nous avons vérifié notre version de Logrotate, exploré la configuration par défaut de Logrotate sur Ubuntu, et configuré deux types différents de configurations personnalisées. Pour en savoir plus sur les options de ligne de commande et de configuration disponibles pour Logrotate, vous pouvez consulter sa page de manuel en exécutant man logrotate dans votre terminal ou en visitant la documentation en ligne.

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04