Faire pivoter et archiver les journaux avec la commande Linux logrotate


  • FrançaisFrançais


  • 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 que rotate 7, cela signifierait que les journaux seraient conservés pour les sept derniers jours. D’autres options sont weekly, monthly, yearly. Il y a aussi size 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 que logrotate s’exécute. Tu peux même courir logrotate dans un cron 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. Utilisation nocompress 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 aussi prerotate/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 .log

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

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

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

    Source

    La Rédaction

    L'équipe rédactionnnelle du site

    Pour contacter personnellement le taulier :

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    Copy code