Conserver la taille du fichier journal fixe sans logrotate

13

Existe-t-il un moyen de conserver la taille du fichier journal fixe sans le faire pivoter par un nouveau fichier vide et supprimer (ou archiver) l'ancien fichier. Par exemple, si je règle la taille maximale du fichier journal à 1 Mo, une fois la taille du fichier augmentée au-delà de cette limite, il sera automatiquement bloqué, le texte est ajouté à la «queue» et la partie la plus ancienne du texte s'affiche pour conserver la taille du fichier 1 Mo .

uray
la source
utilisez logrotate, puisrm -f *.tar.gz.*
Marco Ceppi
1
Y a-t-il une raison particulière pour laquelle vous ne voulez pas faire tourner le journal ou utiliser logrotate? Que voulez-vous exactement? Archiver l'ancien journal à 1M et en commencer un nouveau? Le début de votre question n'est pas tout à fait compatible avec la fin.
David Thornley
qu'est-ce que pop-out signifie?
tshepang

Réponses:

4

Vous pouvez écrire un petit script bash pour ce faire. Limitez simplement le fichier à un certain nombre d'octets en utilisant tail -cet écrasez le fichier.

de man tail:

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
jjclarkson
la source
3
Je suis relativement sûr qu'une fois que vous "écraserez le fichier", l'enregistrement ne reprendra pas automatiquement sur le nouveau fichier.
Stephen Jazdzewski
0

Votre seule solution peut consister à écrire votre propre système de fichiers d'espace utilisateur ou à contribuer à un système existant. Regardez la liste partielle du système de fichiers dans l'espace utilisateur

Si vous n'avez pas les compétences pour contribuer, offrez une publicité de projet ou $$$ ou les deux, pour l'ajouter pour vous.

J'aimerais avoir le temps de le faire, j'ai toujours voulu quelque chose exactement comme ça.

Stephen Jazdzewski
la source
0

Vous pouvez faire quelque chose de similaire en utilisant un FIFO, qui est un peu comme un fichier de taille zéro octet.

Cependant, notez que si rien n'est en cours de lecture à partir de ce fichier, le processus syslog peut devenir bloqué et arrêter d'écrire dans TOUS vos fichiers journaux. Je ne sais pas si ce comportement a été modifié avec les nouvelles versions d'Ubuntu / CentOS.

Un exemple ici

Pour un autre exemple, essayez quelque chose comme ça.

Faites votre FIFO:

sudo mkfifo /var/log/everything.fifo

Et ajoutez ceci à (r) syslog.conf, puis redémarrez syslog:

*.*     |/var/log/everything.fifo

Affichez ensuite le FIFO à partir d'une seule fenêtre:

cat /var/log/everything.fifo

Et dans une autre fenêtre, envoyez des trucs à syslog:

logger Test1
logger Test2
logger Test3

Vous devriez voir les lignes "Test *" dans la sortie catci - dessus.

Cette fonctionnalité peut être idéale pour le débogage, surtout si vous ne souhaitez pas conserver les données plus longtemps. Par exemple, si vous voulez tout voir à l'exception du spam du pare-feu, vous pouvez faire quelque chose comme ceci:

grep -vi "kernel: .* on wan" /var/log/everything.fifo
Stefan Lasiewski
la source
0

Voici ma deuxième réponse. C'est assez hackish.

Utilisez watch (1) pour exécuter à plusieurs reprises tail --bytes=1024(les 1024 derniers octets du fichier journal, merci à @jjclarkson pour cette réponse).

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

Et puis visualisez le fichier avec:

less --raw-control-chars /tmp/messages.watch

La différence entre watchet une boucle while est qu'elle watchne mettra à jour /tmp/messages.watch que s'il y a eu des modifications dans / var / log / messages.

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

Et bien, je suppose que vous pourriez mettre un testdans la boucle while pour que la queue ne soit exécutée que si / var / log / messages a été mis à jour, mais je ne vais pas le comprendre maintenant.

Stefan Lasiewski
la source
0
 * prune - coupe les sommets d'une liste de fichiers décrits dans le
 * fichier / etc / default / prune. Conçu pour être exécuté périodiquement
 * depuis cron, l'idée est de raccourcir automatiquement le journal
 * des fichiers qui se développent pour toujours. Ce fichier contient une liste de
 * fichiers (chemin d'accès complet) et le nombre de blocs
 * doit être conservé. Pour conserver une certaine raison, le pruneau
 * découpez le fichier après le prochain saut de ligne. Le fichier
 * / etc / default / prune devrait ressembler à ceci:
 *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / messages 200
 * / usr / adm / sup_log 5
 *
 * L'entrée crontab sur infoswx pour prune ressemble à:
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 *
 * Compiler avec: cc -O -o prune prune.c
 *
 * Les définitions suivantes peuvent être ajustées selon vos goûts
 * et la taille de votre bloc système.
 *
 * Ray Davis infoswx! Abeilles 25/09/85

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=en&ie=UTF-8&q=prune+log+file&pli=1

De nombreux démons (la plupart? Tous?) Rouvriront leurs fichiers journaux s'ils reçoivent un signal HUP (par exemple par le même travail cron qui exécute le pruneau)

RedGrittyBrick
la source
0

Je suis certain que l'affiche originale a trouvé une solution après 8 ans. Voici un autre pour ceux qui peuvent lire ce fil ...

curtail limite la taille de la sortie d'un programme et préserve les 200 derniers Mo de sortie avec la commande suivante:

run_program | curtail -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

Dave Wolaver
la source