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 ?