Comment limiter un fichier journal aux N dernières lignes?

0

J'ai un grand ./programnombre de messages de journalisation ainsi qu'un espace de stockage très limité sur mon VPS:

Je voudrais que mon fichier journal ne contienne que les dernières N lignes tout le temps (ou plutôt quand je termine ^Cmon programme ou quand il se bloque ... )

A. Je ne veux pas ce qui suit:

  1. "Redirige la sortie dans un fichier (journal), puis utilise tailpour ne conserver que les N dernières lignes."

    Eh bien, le fichier journal prendrait toujours un espace précieux jusqu'à ce que je fonctionne tail, ce qui le rend inutile. Je peux configurer un cronjob pour le faire périodiquement si je n'ai pas d'autre choix, mais j'aimerais explorer les possibilités premier.

  2. "Utilisez logrotate."

    logrotate semble être la solution appropriée au problème, mais c’est trop compliqué et je veux quelque chose de plus simple, de préférence quelque chose que je peux faire avec des pipes et des redirections.

B. J'ai essayé ce qui suit:

(remplacé ./programpar seq 1000000si pour tester)

  1. seq 1000000 | tee /dev/fd/2 | tail -n 10 > logfile

    Fonctionne parfaitement bien quand il se termine tout seul, mais quand je l’interromps ^Cmoi-même, le logfileest vide (alors que je pense qu’il contiendra les 10 dernières lignes imprimées à l’écran par tee)

  2. mkfifo fifo; tail fifo -n 10 > logfile & seq 1000000 | tee fifo

    Fonctionne parfaitement bien quand il se termine tout seul, mais quand je l’interromps ^Cmoi-même, le logfilen'est pas vide, mais ne contient pas non plus un peu des dernières entrées du journal qui sont imprimées à l’écran:

.

$ tail fifo -n 10 > logfile & seq 1000000 | tee fifo
[1] 2616
1
2
3
⋮
480178
480179
480180
480181
480182
480183
^C
[1]+  Done                    tail fifo -n 10 > logfile
$ cat logfile
479297
479298
479299
479300
479301
479302
479303
479304
479305

Ici, vous pouvez voir que les dernières entrées sont à 480 milliers, alors que la dernière entrée dans le logfileest de 479 305 ... ce qui signifie que je manque 878 dernières lignes! Je pense que cela a quelque chose à voir avec la mise en mémoire tampon, mais je ne suis pas sûr.

Quelqu'un peut-il me montrer comment faire cela en utilisant uniquement des utilitaires shell et (de préférence standard) Linux? Merci!

Bora M. Alper
la source
Personnellement, j’utilise un cron qui tourne tous les jours à 00h12 pour purger les fichiers journaux ... étant donné qu’ils sont redimensionnés tous les jours, ils ne grossissent jamais, ce cron génère du html dans un fichier à inclure dans une page de statut personnelle (mélange de php et html) qui me permet de garder un oeil sur les choses.
Tyson

Réponses:

0

La solution la plus simple pour votre cas est probablement le journal circulaire, de taille fixe.

Si vous êtes sur Linux, vous pouvez essayer le module du noyau emlog

Le module de noyau emlog implémente un pilote de périphérique à caractère simple. Le pilote agit comme un canal nommé doté d'un tampon circulaire fini. La taille de la mémoire tampon est facilement configurable. Au fur et à mesure que plus de données sont écrites dans la mémoire tampon, les données les plus anciennes sont supprimées. Un processus qui lit à partir d'un périphérique emlog lira d'abord le tampon existant, puis verra le nouveau texte tel qu'il est écrit, comme pour surveiller un fichier journal à l'aide de "tail -f". (Les lectures non bloquantes sont également prises en charge si un processus doit obtenir le contenu actuel du journal sans bloquer pour attendre de nouvelles données.)

Sur les systèmes BSD, voir CLOG(8)

Alex
la source