[gull] Tronquer des fichiers log

Félix Hauri felix at f-hauri.ch
Tue Jan 4 11:56:21 CET 2011


On Tue, Jan 04, 2011 at 07:50:49AM +0100, Frédéric Benninger wrote:
> Split me fait pester.
> 
> Il crée une multitude de fichiers,
Ok, tu cherches donc à ``détruire'' les ``vieux'' logs et ne conserver
que les 100 derniers Ko d'historique!?

Je ne suis pas sûr de bien comprendre le but recherché.

> et son approche et de commencer la découpe par le haut, le dernier
> fichier sera probablement toujours plus petit que 100Ko.
Oui, mais c'est très ``basique''.

> Pour envoyer le fichier à l?envers j?ai utilisé tac, split, tac
Oulah!

> mais ça devient lourd
:)
> 
> Quasi certains que ça vas poser des gros problèmes si qqun fait un
> ajout dans le fichier log en cours de traitement?
Dans tous les cas, pour gèrer les logs, logrotate est le fruit
d'années d'expériences et devrait logiquement correspondre.

Sinon, pour les problèmes de ``trous'' il faut utiliser des
``snapshots'' (voire LVM, BTRFS, etc..) ou des méthodes qui te
garantissent une ``atomicité''.

Par exemple, pour ton ``file.log'', créer un répertoire dans lequel
tu rangera LE file.log et son ``intantanné'':
 
Si tu as un programme qui écrit séquentiellement dans ton fichier
de log, tu devras en outre t'assurer qu'il va bien ``ré-ouvrir''
sa sortie de logs (voire ``reload'', ``kill -USR1'' autre...)

 $ mv file.log file.log.0 || exit 1
 $ killall -USR2 mydaemond  # RTFM!
Le ``mv'' est atomique, mais le couple mv+kill ne l'est pas,
cependant cela ne devrait pas poser de problème, que le daemon
rajoute une ligne ou non, après qu'on ait renomé le fichier.
Ce qui est important, c'est qu'a partir de maintenant et pour la
suite, le daemon n'adresse plus l'inode de l'ancien file.log devenu
file.log.0 mais bien un nouvel inode qu'il créera au premier évennement.

Une fois cette première étape passée, on peut se désintéresser de file.log
qui peut continuer de recevoir les prochains evennements.

 $ sed -e 1,$(
		(head -c $(($(stat -c %s file.log.0)-100000)) file.log.0;
		echo) | wc -l)d -i file.log.0
ou
 $ tac file.log.0 | \
	split -C 100000 - file.log.split. && \
	tac file.log.split.aa >file.log.0
 $ rm file.log.split.*

c'est comme tu veux, de toutes façons, t'as le temps.

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list