Logrotate

De UnixManiax
Aller à la navigation Aller à la recherche


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.

Attention : si les logs sont dans un répertoire qui est accessible en écriture à un groupe autre que root, logrotate va renvoyer une erreur. Dans ce cas, il faut ajouter une ligne su.

Exemple :

$ ls -ld /var/log/mon_appli/
drwxrwxr-x 6 appli_user appli_grp 20480  4 juin  15:08 /var/log/mon_appli/

$ cat /etc/logrotate.d/mon_appli.conf
/var/log/mon_appli.log
{
  create 644 root root
  su root root
  ...
}

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
  • notifempty => 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