1 votes

un outil de rotation des journaux qui ne conserve qu'une quantité donnée de journaux et rejette tout le reste.

Je cherche un outil de type cronologie qui ne conserverait que les n dernières lignes ou les x dernières minutes des logs qui lui sont envoyés et rejetterait tout le reste.

Cette bête existe-t-elle ?

UPDATE :

Je connais logrotate, qui renomme et zippe les anciens fichiers journaux, ce qui n'est pas ce que je veux.

Je veux éliminer les anciennes lignes du journal et ne garder que les lignes récentes.

Comme par exemple en faisant ceci de temps en temps : tail -10000 logfile > logfile.new mv logfile.new logfile sauf qu'avec cette technique vous perdrez très certainement des lignes de log et vous devrez redémarrer ou signaler à l'application de logging de rouvrir le logfile.

4voto

WildJoe Points 2515

Logrotate peut être configuré pour ne conserver qu'une seule copie d'un fichier journal... Si vous faites un RTFM, vous trouverez le passage suivant concernant les paramètres de configuration :

rotate count
    Log files are rotated count times before being removed or mailed to the 
    address specified in a mail directive. If count is  0,  old  versions  
    are  removed  rather than rotated.

Vous pouvez coupler faire pivoter avec taille toujours à partir de la logrotate(8) page de manuel, pour que le fichier reste de petite taille. Non pas par le nombre de lignes mais par la taille k, M, G.

size size
    Log  files  are rotated when they grow bigger than size bytes. If size is 
    followed by M, the size if assumed to be in megabytes.  If the G suffix is 
    used, the size  is  in gigabytes.   If  the k is used, the size is in 
    kilobytes. So size 100, size 100k, and size 100M are all valid.

2voto

Saurabh Barjatiya Points 4643

Vous pouvez utiliser logrotate et mettre

tail -10000 logfile.0 > logfile.0.new 
mv logfile.0.new > logfile.0

dans le cadre de la commande postrotation. logrotate vous permet de spécifier des commandes de postrotation.

0 votes

Ce n'est pas une mauvaise idée, mais cela conserve deux fichiers journaux, un actuel et un ancien. Et cela ne conserve pas la quantité fixe de journaux.

1voto

Bernhard Points 891

Vous devrez de toute façon redémarrer ou signaler l'application. L'application doit d'une manière ou d'une autre connaître le nouvel offset pour seek()ing ou doit rouvrir le filehandle lorsque vous coupez le fichier journal.

0 votes

Idéalement la même application pourrait à la fois enregistrer et découper, pensez à un remplacement de logwatch. Je voudrais éviter d'envoyer des signaux à l'application originale, si possible.

0voto

Kevin M Points 2292

Je ne comprends pas tout à fait ce que vous dites, mais vous pourriez vérifier logrotate(8) . De la page de manuel :

logrotate est conçu pour faciliter l'administration des systèmes qui génèrent un grand nombre de fichiers journaux. Il permet la rotation, la compression, la suppression et l'envoi automatiques des fichiers journaux. Chaque fichier journal peut être traité ... lorsqu'il devient trop gros.

Il est installé par défaut sur RHEL et ses dérivés. Je ne sais pas pour les autres systèmes comme Ubuntu/derivitives ou Windows.

0 votes

Je connais logrotate, qui renomme et zippe les anciens fichiers journaux, ce qui n'est pas ce que je veux. Je veux supprimer les anciennes lignes de journal et ne garder que les récentes. Par exemple, en faisant ceci de temps en temps : tail -10000 logfile > logfile.new mv logfile.new logfile sauf qu'avec cette technique vous perdrez certainement des lignes de log et vous devrez redémarrer ou signaler à l'application d'enregistrement de rouvrir le fichier de log.

0voto

TonyB Points 2482

A la fin, j'ai résolu le problème de la manière suivante (pas la plus élégante, mais elle fonctionne) :

dans apache (ou dans les journaux de qui que ce soit) :

CustomLog "|/usr/local/cronolog/sbin/cronolog /var/tmp/mylog.%Y%m%d.log" logformat

dans cron.daily :

find /var/tmp/ -name mylog* -mtime +$days | xargs --no-run-if-empty rm

ceci supprimera les anciens journaux

et enfin dans l'analyse du script< :

lastdate=$(date -d "$INTERVAL sec ago" +%Y-%m-%dT%H:%M:%S)

grep -h $SEARCH /var/tmp/mylog* | awk -v lastdate="$lastdate" '$1>lastdate { print }' > /tmp/cutlog

et ensuite travailler avec /tmp/cutlog

l'exemple ci-dessus suppose des timestamps ISO dans le premier champ comme : 2009-07-20T13:52:32

Ce n'est pas le moyen le plus élégant, mais il fait ce que je veux. Peut-être qu'un jour j'écrirai une fonctionnalité pour cronolog qui ferait la même chose :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X