Question Transformer un fichier journal en une sorte de tampon circulaire


Mes amis, existe-t-il une solution * nix qui permettrait au fichier journal de fonctionner comme un tampon circulaire? Par exemple, j'aimerais que les fichiers journaux stockent un maximum de 1 Go de données et suppriment les entrées les plus anciennes une fois la limite atteinte.

Est-ce possible? Je crois que pour obtenir ce fichier journal, il devrait être transformé en une sorte de périphérique spécial ...

P.S. Je connais des outils de journalisation divers, mais ce n’est pas ce dont j’ai besoin. Logrotating nécessite beaucoup d'E / S, cela se produit généralement une fois par jour, alors que j'ai besoin d'une solution "d'exécution".


16
2018-04-17 07:24


origine


Je ne suis pas sûr de savoir pourquoi vous pensez que la rotation des journaux nécessiterait beaucoup d'E / S. La rotation de 10 fichiers journaux représente 10 opérations de changement de nom et un HUP du service. Pas exactement une opération meurtrière ... Et c'est la solution standard à votre problème :) - pehrs
On peut exécuter un script / exécutable qui ne fonctionne pas bien avec HUP. - Scott
Ceci est pour fournir un autre cas d'utilisation pour votre question. J'ai un lecteur de musique diabolisé. Je veux un journal de quelques lignes pour pouvoir voir ce qui se joue et ce qui a été joué auparavant. UNE tail -f somefile ferait cela. Je viens d'essayer avec des journaux tournés et tail -f ne fonctionne pas avec ceux-ci. - Vorac


Réponses:


Linux a un tampon circulaire du noyau. Vous pouvez utiliser dmesg à l'afficher.

Ou ici est un module de noyau Linux qui semble faire ce que vous voulez.

Qu'est ce que emlog?

emlog est un module de noyau Linux qui facilite l'accès à la sortie la plus récente (et à la plus récente) d'un processus. Cela fonctionne comme "tail -f" sur un fichier journal, sauf que le stockage requis ne grandit jamais. Cela peut être utile dans les systèmes intégrés où la mémoire ou l'espace disque est insuffisant pour conserver des fichiers journaux complets, mais les messages de débogage les plus récents sont parfois nécessaires (par exemple, après l'observation d'une erreur).

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.)


12
2018-04-17 10:49



Merci pour le lien! Par ailleurs, la page d’accueil de emlog contient un lien vers ulogbufd, qui est probablement même une solution plus appropriée pour moi. - pachanga
le emlog Le module de noyau est maintenant maintenu sur github: github.com/nicupavel/emlog - dbernard


La chose la plus proche à laquelle je puisse penser est RRDTools, mais ce n’est probablement pas ce que vous recherchez. Une autre solution serait de surveiller le fichier journal (par exemple toutes les secondes ou sous Linux avec inotify), par exemple. vous écrivez un script comme:

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done

avec inotify:

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done

4
2018-04-17 07:46



+1 pour mentionner RRDtool, un exemple réel d’enregistrement de structure de données en anneau. - Cory J
Merci, par exemple, d’afficher l’utilisation des commandes du shell inotifywait - pachanga


Vous pouvez utiliser multilog de Daemontools de DJB. Vous dirigez votre journal dans il. Oui, c'est la rotation du journal, mais les rotations sont simplement:

ln current $tai64nlocaltimestamp

Quel que soit le système de fichiers linux moderne, c’est une opération extrêmement rapide. Vous pouvez spécifier le nombre de fichiers journaux que vous souhaitez et leur taille. créer des fichiers de 10 x 1024 Mo, et vous aurez votre tampon en anneau de 1 Go.

Notez qu'en raison de la rotation automatique, il s'agit d'une source par instance multilog. Mais vous pouvez contourner ce problème en écrivant un wrapper simple avec netcat ou à la main.


4
2018-04-17 11:38



Merci pour le conseil! Je vais certainement avoir à multilog aussi. - pachanga


Vous pouvez créer un tube FIFO puis le lire à l'aide d'un script qui l'insère dans une base de données. Lorsque le compteur atteint 1 000, redémarrez le numéro d'identification inséré dans la base de données. Cela ne fonctionnerait bien sûr pas pour la taille, mais vous avez utilisé cet exemple comme exemple. Je suppose donc qu’il s’agit d’une question théorique.


1
2018-04-17 07:31





Question interessante; vous ne voyez généralement pas cela comme une conception. J'ai un programme qui utilise une technique légèrement similaire pour enregistrer l'historique, mais il utilise un format binaire. Le "fichier journal" comprend quatre parties, toutes présentées dans un format indépendant de la machine:

  1. Un en-tête contenant le numéro magique et le nombre (maximum) d'entrées dans la liste utilisée et la liste libre, le numéro de séquence de la prochaine entrée d'historique, le nombre réel d'entrées dans la liste utilisée, le nombre réel d'entrées dans la liste libre et la longueur du fichier (chacun ayant 4 octets).
  2. La liste utilisée, chaque entrée donnant un décalage et une longueur (4 octets pour chaque partie de chaque entrée).
  3. La liste libre, chaque entrée similaire à l'entrée de liste utilisée.
  4. Les données principales, chaque enregistrement d’historique consistant en un ensemble d’octets contigus se terminant par un octet de terminaison nul.

Lorsqu'un nouvel enregistrement est alloué, s'il y a de la place dans la liste libre, il écrase alors une entrée (sans utiliser nécessairement tout - dans ce cas, le fragment reste dans la liste libre). Lorsqu'il n'y a pas d'espace dans la liste libre, un nouvel espace est alloué à la fin. Lorsqu'un ancien enregistrement disparaît, son espace est déplacé vers la liste disponible et fusionné avec tous les enregistrements libres adjacents. Il est conçu pour gérer les instructions SQL afin que les enregistrements puissent être répartis sur plusieurs lignes. Ce code fonctionne sur un nombre spécifié d'enregistrements. Cela ne limite pas la taille du fichier en tant que tel (bien qu'il ne soit pas difficile de le faire).

Le code principal de l'historique du code se trouve dans deux fichiers, history.c et history.h, disponibles à la source du programme SQLCMD (ma version n'est pas celle de Microsoft; la mienne existait une décennie ou plus avant celle de Microsoft), qui peut être téléchargée à partir le groupe d'utilisateurs international Informix Archive de logiciels. Il existe également un programme de vidage du fichier d’historique (histdump.c) et un testeur d’historique (histtest.ec), qui prétend être ESQL / C, mais qui est en réalité un code C; l’une des fonctions de support qu’il appelle utilise un certain Informix ESQL / C. fonctions de la bibliothèque). Contactez-moi si vous souhaitez expérimenter sans utiliser Informix ESQL / C - voir mon profil. Il y a quelques modifications triviales à faire pour compiler histtest en dehors de son environnement de conception, plus vous avez besoin d'un makefile.


1
2018-04-17 09:06





Je suis d'accord avec le commentaire de pehrs à votre question. La rotation du journal n'est pas si difficile. Vous pouvez configurer logrotate ou un autre script pour vérifier périodiquement votre fichier journal, même toutes les minutes si vous le souhaitez. Lorsqu'il détecte une taille de fichier de 1 Go, le fichier est simplement renommé, ce qui évite les entrées / sorties. Pendant le changement de nom, le processus continue d'écrire le fichier journal. Le rotateur de journaux peut ensuite envoyer un HUP à votre démon syslog (votre démon). est se connecter via syslog, non? Sinon, il devrait supporter le signal HUP s'il est bien écrit ...) pour qu'il rouvre le chemin du fichier d'origine. À ce stade, il commencera à écrire dans un nouveau fichier dans le chemin d'origine et vous pourrez supprimer la version pivotée.


0
2018-04-17 16:58