Logrotate
Présentation
Logrotate est la partie de syslog qui gère la rotation des fichiers de log, évitant ainsi qu'ils ne deviennent trop gros ou trop nombreux. Chaque log est paramétrable indépendament des autres.
Logrotate possède un fichier de configuration principal : /etc/logrotate.conf.
En général, logrotate.conf inclue tout le répertoire /etc/logrorate.d/, ce qui permet d'avoir autant de sous-fichiers de configuration que l'on veut dans ce répertoire. La totalité du sous-répertoire est parcourue. On peut en inclure d'autres. La syntaxe pour inclure /etc/logrotate.d est :
include /etc/logrotate.d
Donc quand on veut ajouter une configuration, on peut au choix modifier logrotate.conf ou ajouter un nouveau fichier dans logrotate.d, pour ne pas surcharger le fichier principal.
Exemple : modifier les droits des logs
Il peut être intéressant de modifier les droits de certains fichiers de log pour les rendre lisibles à certains comptes, par exemple un compte de surveillance, qui a besoin d'un accès en lecture seule sur des logs qui ne sont nativements accessibles qu'à root.
Bien sûr, on peut faire un chmod directement dessus, mais à la prochaine rotation de fichier, le nouveau log reprendra les droits par défaut.
Voici justement comment modifier les droits par défaut du fichier /var/log/maillog.
Editer le fichier /etc/logrotate.conf, et ajouter les lignes suivantes :
# ajout des droits 644 sur maillog /var/log/maillog { create 644 root root }
Les options après le mot create sont, dans l'ordre, les droits, le propriétaire, le groupe. Ici le fichier appartiendra à root:root avec les droits 644.
Remarque : ce changement de droits ne sera effectué qu'à la prochaine rotation du fichier log.
Exemple plus complet
Voici notre fichier d'exemple :
# cat /etc/logrotate.d/httpd /var/log/httpd/*log { create 644 apache apache compress daily delaycompress rotate 7 missingok notifempty sharedscripts postrotate /sbin/service httpd reload > /dev/null 2>/dev/null || true endscript }
Explications :
- /var/log/httpd/*log { => ce qui va être contenu entre les { } concernera tous les fichiers /var/log/httpd/*log
- create 644 apache apache => les fichiers appartiendront à apache:apache avec les droits 644 (il ne faut pas mettre les ":" entre le user et le group.
- compress => les fichiers seront compressés...
- delaycompress => ... sauf le log courant et le précédent
- daily => la rotation se fait tous les jours
- rotate 7 => on garde 7 logs en archive (en plus du log courant)
- missingok => si un fichier de log est manquant, on passe au suivant sans générer d'erreur
- notifyempty => la rotation ne se fait pas si le log est vide
- sharedscripts => les scripts qui suivent ne seront exécutés qu'une seule fois par rotation, et non une fois par rotation et par fichier rencontré
- postrotate/endscript => les lignes qui se trouvent entre postrotate et endscript seront exécutées après la rotation du fichier de log.
- } => fin
Voici à quoi ressemblent les fichiers de logs après quelques semaines :
# ls -lh /var/log/httpd/ total 158M -rw-r--r-- 1 root root 47M Jun 6 15:29 access_log -rw-r--r-- 1 root root 91M Jun 6 04:02 access_log.1 -rw-r--r-- 1 root root 3.9M Jun 6 04:02 access_log.2.gz -rw-r--r-- 1 root root 1.9M Jun 5 04:02 access_log.3.gz -rw-r--r-- 1 root root 2.1M Jun 4 04:02 access_log.4.gz -rw-r--r-- 1 root root 4.0M Jun 3 04:02 access_log.5.gz -rw-r--r-- 1 root root 3.9M Jun 2 04:02 access_log.6.gz -rw-r--r-- 1 root root 5.1M Jun 1 04:02 access_log.7.gz -rw-r--r-- 1 root root 1.6K Jun 6 14:55 error_log -rw-r--r-- 1 root root 578 Jun 6 04:02 error_log.1 -rw-r--r-- 1 root root 11K Jun 6 04:02 error_log.2.gz -rw-r--r-- 1 root root 363 Jun 5 04:02 error_log.3.gz -rw-r--r-- 1 root root 276 Jun 4 04:02 error_log.4.gz -rw-r--r-- 1 root root 521 Jun 3 04:02 error_log.5.gz -rw-r--r-- 1 root root 480 Jun 2 04:02 error_log.6.gz -rw-r--r-- 1 root root 717 Jun 1 04:02 error_log.7.gz
Les autres options de logrotate
Au lieu de faire une rotation quotidienne, comme c'est le cas dans l'exemple précédent, une option courante est d'effectuer la rotation dès que le log atteint une certaine taille. Dans ce cas on utilise l'option "size" suivie de la taille en octets. Exemple :
size 300M
Sinon, la page man est tellement bien faite qu'il n'est pas utile de tout refaire. Vous trouverez tout ici : http://www.delafond.org/traducmanfr/man/man8/logrotate.8.html
Compléments
Logrotate est normalement appelé par la crontab. Sinon, vous pouvez le forcer manuellement avec l'option "-f" :
logrotate -f /etc/logrotate.conf
Ceci va forcer l'exécution de toutes les confs logrotate. Si on veut juste forcer un script, par exemple pour tester sa syntaxe, on spécifie le fichier :
logrotate -f /etc/logrotate.d/mon_logrotate