Les fichiers logs, appelés aussi fichiers de traces ou fichiers journaux, sont des fichiers qui conservent la trace de toutes les requêtes qui ont été adressées à un serveur donné.
Un fichier log est généralement un fichier texte classique. Son contenu regroupe de manière chronologique l’ensemble des événements et actions affectant un système informatique (en l’occurrence, notre serveur).
Ces fichiers sont importants lorsqu’il s’agit d’analyser l’utilisation d’une application ou diagnostiquer un problème rencontré, et puisqu’un fichier log trace de manière continu les événements générés par le serveur, sa taille grandit rapidement au fil du temps et peut atteindre des tailles importantes.
Avoir des fichiers logs de tailles importantes sur une machine peut dégrader ses performances et rend difficile de diagnostiquer un problème donné (trouver une ligne parmi un million d’enregistrements, est-ce facile ?)
Pour ces raisons et d’autres, il est primordiale de garder ses fichiers logs sous une taille facile à gérer et supprimer les fichiers qui sont très anciens et n’ont plus de grande importance.
Plusieurs serveurs et applications implémentent leurs propres mécanismes de rotations des logs, mais ce n’est pas toujours le cas, c’est pourquoi, il faudra trouver une alternative.
Heureusement, les systèmes GNU/Linux offrent un outil nommé Logrotate qui permet d’effectuer cette tâche avec finesse.
Cet outil permet d’automatiser la rotation, la compression, la suppression, et l’envoi des fichiers logs.
Vous avez le choix de traiter vos fichier soit quotidiennement, hebdomadairement, mensuellement, ou selon la taille du fichier (10 Mo, 50 Mo …).
Comment fonctionne Logrotate
L’outil est exécuté par le système chaque jour moyennant le tâche cron disponible sous
/etc/cron.daily/logrotate
Son contenu contient la ligne suivante :
/usr/sbin/logrotate /etc/logrotate.conf
Quand ce script est déclenché, il cherche dans son fichier de configuration (logrotate.conf) et détermine l’emplacement des fichiers logs à analyser et effectuer une rotation si nécessaire, ceci dépendra des informations que vous avez mentionné.
Que contient logrotate.conf ?
C’est le fichier de configuration principal et contient les paramètres par défaut qu’utilise Logrotate au moment de la rotation.
# see "man logrotate" for details # rotate log files weekly weekly : Effectuer la recherche chaque jour. # keep 4 weeks worth of backlogs rotate 4 : Conserver au maximum 30 fichiers logs (au-delà de 30, on commence à supprimer les plus anciens). # create new (empty) log files after rotating old ones create : Créer un nouveau fichier vide après la rotation. # use date as a suffix of the rotated file dateext : Ajouter la date actuelle comme suffixe au fichiers traités. # uncomment this if you want your log files compressed #compress : Compresser les fichiers traités. # RPM packages drop log rotation information into this directory include /etc/logrotate.d : Inclure les fichiers de configuration diponibles sous ce répertoire /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 }
Si on essaye de traduire cet exemple, ce sera quelque chose du genre :
Recherche moi les fichiers logs disponibles sous le répertoire /var/log/btmp, si tu ne trouves
aucun fichier, ne fais rien (missingok), sinon:
pour chaque fichier trouvé, copie son contenu dans un nouveau fichier et crée moi un fichier vide ayant les permissions 0600, appartenant à l’utilisateur root et le groupe utmp.
Ne garde qu’une seule copie de ce fichier, c’est à dire, à la prochaine rotation, supprime l’ancienne copie avant d’exécuter le traitement.
Ainsi, pour que logrotate analyse et éventuellement effectue une rotation sur vos fichiers logs, il faut créer un ou des fichiers de paramètres (selon vos besoins) dans le répertoire /etc/logrotate.d/ portant un nom quelconque, et bien sur respecter la syntaxe précédente.
Exemple de rotation du fichier mysql.log ?
On crée un fichier /etc/logrotate.d/mysql ayant le contenu suivant :
/var/log/mysqld.log { create 640 mysql mysql notifempty missingok postrotate # just if mysqld is really running if test -x /usr/bin/mysqladmin && \ /usr/bin/mysqladmin --defaults-extra-file=/root/mysql/logrotate.cnf ping &>/dev/null then /usr/bin/mysqladmin --defaults-extra-file=/root/mysql/logrotate.cnf flush-logs fi /usr/bin/chcon -u system_u -r object_r -t mysqld_log_t /var/log/mysqld.log endscript }