Logrotate

De Banane Atomic
Aller à la navigationAller à la recherche

Généralités

Logrotate est exécuté tous les jour via le timer de systemd configuré dans le fichier /usr/lib/systemd/system/logrotate.timer

Tests

Bash.svg
# test la configuration du fichier /etc/logrotate.d/nginx
logrotate -d /etc/logrotate.d/nginx
# -d → debug: aucune modification n'est faite
# -f → force: force la rotation

# vérifier quels log ont été archivés
cat /var/lib/logrotate.status

Configuration

/etc/logrotate.conf
# fréquence de rotation: daily, monthly, weekly
weekly

# nombre d'archives conservées avant la suppression (file.log.1.gz)
rotate 4

# effectuer une rotation lorsque le fichier atteint la taille définie (M pour megabytes, k pour kilobytes)
# size remplace la fréquence de rotation
size 10M

# effectuer une rotation lorsque le fichier atteint la taille définie ET que la la fréquence de rotation est écoulée
minsize 10M

# ne pas effectuer la rotation si le fichier est vide
notifempty

# create un fichier de log vide après la rotation
create
# il est possible de spécifier les droits, le user et le group du nouveau fichier
create xxx user group
# par défaut, même mode, user et group que le fichier précédent

# zipper le fichier de log avant la rotation
compress

# zipper le fichier de log lors de la prochaine rotation. Fonctionne seulement si l'option « compress » est activée.
# Utile si l'application ne peut fermer immédiatement son accès au fichier de log et continue à écrire dedans.
delaycompress

# déplacer les fichiers dans un autre répertoire après la rotation
olddir /var/log/archive

# liste des fichiers à ignorer, par défaut: .rpmorig, .rpmsave, .swp, .rpmnew, ~
# l'utilisation de « + » permet d'ajouter de nouveaux fichiers à ignorer, sinon la liste est écrasée
tabooext + .pacorig .pacnew .pacsave

/var/log/dossier/*log {
    # si le fichier de log n'existe pas, ne pas générer d'erreurs
    missingok

    # n’exécuter qu'une seule fois prescript et postscript pour tous les fichiers correspondant au pattern
    sharedscripts
    # par défaut prescript et postscript sont exécutés pour chaque fichier de log correspondant au pattern

    # code exécuté avant la rotation
    prerotate
        code
    endscript

    # code exécuté après la rotation
    postrotate
        code
    endscript
}

nginx

/etc/logrotate.d/nginx
/var/log/nginx/*log {
    size 5M
    rotate 2
    missingok
    sharedscripts
    compress
    postrotate
        test ! -r /var/run/nginx.pid || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Le fichier /var/run/nginx.pid contient l'id du processus nginx en cours d’exécution.
kill -USR1 envoie un signal à nginx pour qu'il recharge ses fichiers de log.

php-fpm

PHP 7.0: php-fpm does no longer provide a logrotate configuration. Instead syslog/journald is used by default
/etc/logrotate.d/php-fpm
/var/log/php-fpm.log {
    missingok
    notifempty
    compress
    delaycompress
    rotate 1
    weekly
    postrotate
        /bin/kill -SIGUSR1 `cat /run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

Erreurs

error: failed to rename ... to (null): Permission denied

Le dossier /var/log/xxx doit avoir les droits http:log 750.

Examples

/etc/logrotate.d/apache2
/var/log/apache2/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 640 root adm
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then
            run-parts /etc/logrotate.d/httpd-prerotate
        fi
    endscript
    postrotate
        if pgrep -f ^/usr/sbin/apache2 > /dev/null; then
            invoke-rc.d apache2 reload 2>&1 | logger -t apache2.logrotate
        fi
    endscript
}
/etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi \
    endscript
    postrotate
        invoke-rc.d nginx rotate >/dev/null 2>&1
    endscript
}
/etc/logrotate.d/php8.2-fpm
/var/log/php8.2-fpm.log {
    rotate 12
    weekly
    missingok
    notifempty
    compress
    delaycompress
    postrotate
        if [ -x /usr/lib/php/php8.2-fpm-reopenlogs ]; then
            /usr/lib/php/php8.2-fpm-reopenlogs;
        fi
    endscript
}