4 déc. 2017

logrotate : exemple vite fait

Aujourd'hui, un peu de configuration pour la rotation de ses logs, en utilisant Logrotate.

Sur un système Unix, bon nombre de programmes génèrent des fichiers de log. La rotation de ceux permet de séparer régulièrement les fichiers afin de les empêcher de devenir trop gros (et difficile à exploiter), et à effacer ceux qui sont trop vieux pour empêcher qu'ils ne saturent l'espace disque. La rotation des logs peut aussi être intéressante d'un point de vue légal, si on doit conserver un minimum ou maximum de temps les logs d'accès d'un serveur web, par exemple.

Continuons d'ailleurs sur l'exemple du serveur web. Je vais me baser sur une configuration proche de celle que j'utilise pour le serveur web qui rend ce blog accessible :

/srv/www/*/*/log/*.log {
        compress
        compresscmd /usr/bin/xz
        compressext .xz
        uncompresscmd /usr/bin/unxz
        delaycompress
        daily
        rotate 9999
        create 644 root wheel
        sharedscripts
        missingok
        prerotate
                /usr/pkg/bin/perl /usr/pkg/awstats/bin/awstats_updateall.pl now -awstatsprog=/usr/pkg/awstats/cgi-bin/awstats.pl -configdir=/usr/pkg/etc/awstats/ > /dev/null
        endscript
        postrotate
                /usr/pkg/sbin/apachectl restart > /dev/null 2>/dev/null || true
        endscript

}

Dans cet exemple, on peut remarquer que les logs sont compressés (directive compress), mais pas immédiatement lors de la rotation (directive delaycompress). Il s'agit d'un compromis entre la facilité de recherche dans les logs, et l'espace occupé. Autre information intéressante, l'utilisation de xz, déjà abordé dans un billet précédent, au lieu de Gzip (paramétrage par défaut). La plupart des options sont faciles à comprendre.

Attardons-nous cependant sur les dernières lignes de configuration, en particulier sur les directives prerotate et postrotate. Comme leur nom l'indique, elles permettent d'agir juste avant la rotation et juste après. Ainsi, j'ai choisi dans cette configuration de lancer Awstats pour gérer les statistiques de visites de tous les sites hébergés. Concernant l'action après rotation, la relance du serveur web est obligatoire, car sinon ce dernier continue à écrire dans l'ancien fichier (car l'inode ne bouge pas, lui).

Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux ! Si en plus vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !

Crédit photo : Intermountain Region USFS - logs ET5A3073.

2 déc. 2017

xz pour une meilleure compression de ses fichiers

Aujourd'hui, causons un peu compression. Habituellement, dans le monde Unix, on a tendance à utiliser Gzip. Ce format de compression a le mérite, aujourd'hui, d'être assez rapide, mais il est loin d'être le plus efficace. Une alternative a vu le jour, il s'agit de bzip2. Si ce dernier est bien plus efficace, il est hélas beaucoup plus lent. Comme on cherche toujours à avoir le beurre et l'argent du beurre, d'autres formats de compression ont vu le jour plus récemment, comme XZ, utilisant actuellement l'algorithme LZMA 2.

Pour utiliser le format de compression xz, il suffit d'utiliser les outils xz et unxz. Ils sont généralement disponibles sur toutes les distributions Linux, voire même par défaut depuis longtemps. Les systèmes BSD ne sont pas en reste, puisque NetBSD 7 dispose de xz dans le système de base (une version plus récente est disponible dans pkgsrc). Enfin, seul macOS ne semble pas en disposer nativement, mais cela peut être corrigé grâce à pkgsrc, macports ou Homebrew. Selon les systèmes, en plus des outils de compression et décompression, xz vient avec des outils fichiers "classique" qui décompressent à la volée, comme xzcat, xzgrep, xzless ou xzdiff.

Quelques exemples d'utilisation, à commencer par la compression d'un fichier, ici en mode verbeux et avec un taux de compression maximum :

nils@shell2:~/irclogs/freenode$ xz -v -9 \#gcu.2017-11-30.log
#gcu.2017-11-30.log (1/1)
  100 % 8?020 B / 23,2 KiB = 0,338

Soyons fous, recherchons une chaîne de caractères :

nils@shell2:~/irclogs/freenode$ xzgrep -i -m 1 pinpin \#gcu.2017-11-30.log.xz                                                                                                                                                           
01:26 < pinpin> olivier__ runne irssi v1.0.5 - running on FreeBSD amd64

Et bien entendu, la décompression :

nils@shell2:~/irclogs/freenode$ unxz -v \#gcu.2017-11-30.log.xz 
#gcu.2017-11-30.log.xz (1/1)
  100 % 8?020 B / 23,2 KiB = 0,338

Crédit photo : Internet Archive Book Images - Image from page 1351 of "The Bell System technical journal" (1922).

Propulsé par Dotclear