2 votes

Comment diffuser en perl le contenu de fichiers journaux dont les noms de fichiers changent constamment ?

J'ai une série d'applications sur des systèmes Linux que j'ai besoin de faire sortir en permanence en "streaming" ou même simplement en "tail", mais le défi est que les noms de fichiers sont constamment en mouvement et changent.

Ils sont tous codés par date (les dates étant dans des formats différents) et chacun a ensuite des formats incrémentés différents.

La plupart d'entre eux commencent par un et augmentent, mais l'un d'entre eux n'a pas d'extension et ajoute une extension après le premier fichier et l'autre incrémente un nombre mais une fois qu'il a atteint 99, il roule pour incrémenter un alpha et renvoie le numérique à 01 puis remonte à nouveau car il roule si rapidement.

Je ne dispose que des scripts shell du système d'exploitation, des utilitaires de ligne de commande du système d'exploitation et de perl pour gérer cette situation et permettre à une autre application de récupérer et de lire ces journaux.

Les nouveaux fichiers sont toujours créés au moment où l'on commence à écrire dans le nouveau fichier et des groupes de journaux différents (certains que je lis, d'autres non) sont écrits dans le même répertoire, de sorte que je ne peux pas simplement récupérer ce qui frappe le répertoire.

Si je les fais simplement "tail -n 1000000 -f |" aujourd'hui, cela fonctionne bien pour l'application de lecture que j'utilise jusqu'à ce que le fichier change et que je ne puisse pas configurer les plages de listes de fichiers dans l'application de lecture, mais que je puisse les prétraiter pour qu'ils apparaissent comme un flux continu au lecteur plutôt que d'invoquer directement des commandes pour les lire. A un simple lecteur de journaux en Perl comme ceci fonctionnent également bien pour un nom de fichier statique mais pas pour les noms de fichiers dynamiques. Il est essentiel que je ne traite pas à nouveau les lignes des journaux et que je capture simplement les nouvelles lignes écrites dans les journaux.

J'admets que je ne suis pas un gourou de Perl, et la meilleure réponse/indice que j'ai pu trouver jusqu'à présent est l'utilisation de la fonction la fonction Glob de Perl pour éventuellement faire cela, mais les exemples que j'ai trouvés traitent tous les fichiers à chaque exécution, puis semblent s'arrêter.

Exemples de noms de fichiers que je traite à travers plusieurs applications que j'essaie de gérer

  • appA _YYMMDD.log
  • appA _YYMMDD_0001.log
  • appA _YYMMDD_0002.log
  • WS01 APPB _YYMMDD.log
  • WS02 APPB _YYMMDD.log
  • WS03 AppB _YYMMDD.log
  • APPC MMDD_A01.log
  • APPC MMDD_B01.log
  • YYYYMMDD_001_ APPD .log

Comme indiqué ci-dessus, les fichiers n'ont pas le même inode et il n'est pas possible de surveiller simplement les changements dans le répertoire car beaucoup de choses y sont écrites. Sur le système de développement, il y a plus de 50 journaux écrits dans le répertoire et des milliers de fichiers et j'essaie seulement d'en récupérer 5. Je regarde si multitail peut être mis à disposition pour essayer cette suggestion, mais il n'est pas disponible actuellement et l'installation de tout RPM supplémentaire dans l'environnement est généralement une bataille de plusieurs mois.

ls -i 24792 APPA_180901.log 24805 APPA__180902.log 17011 APPA__180903.log 17072 APPA__180904.log 24644 APPA__180905.log 17081 APPA__180906.log 17115 APPA__180907.log

Donc, en fait, la racine de ce que j'essaie de faire est simplement un flux continu, peu importe si le nom du fichier change, et ne pas avoir à exécuter la commande d'extraction à plusieurs reprises ou avoir de grandes pauses dans le flux de données pendant qu'un script comprend que le fichier enregistré a changé. Je n'ai pas besoin d'analyser le contenu (mon autre application le fait) Existe-t-il un moyen simple de gérer ce changement de nom de fichier ?

1voto

Stefan Becker Points 5191

Que diriez-vous de surveiller les changements dans le répertoire des journaux avec Linux inotify, par exemple. Linux::inotify2 ? Vous pourriez alors détecter la création de nouveaux fichiers journaux, arrêter la lecture de l'ancien fichier journal et commencer à lire le nouveau fichier journal.

1voto

Perl Ancar Points 550

Essayez commutateur de queue . J'ai créé ce script pour mettre en queue les fichiers journaux qui font l'objet d'une rotation quotidienne et dont le nom contient YYYY-MM-DD. Pour utiliser ce script, il suffit de dire :

% tailswitch '*.log'

La citation empêche le shell d'interpréter le motif glob. Le script exécutera le motif glob de temps en temps pour passer à un fichier plus récent en fonction de son nom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X