Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Parser un fichier de log à intervalles réguliers ?

5 réponses
Avatar
schirrms2
Bonsoir,

Je suis confronté à un problème d'analyse de fichiers logs. En fait,
j'ai un programme, qui tourne toutes les 5 minutes et qui (entre autres)
analyse différents fichiers logs.
Le but de l'opération est d'analyser les nouveaux évènements survenus
pendant les 5 dernières minutes.

Mon prédécesseur a géré ceci de manière qui me semble un peu 'lourde' :
A chaque rotation du programme, le fichier log est copié dans son
intégralité. 5 minutes plus tard, le programme exécute la commande
système 'diff fichier_log_courant fichier_log_-5_minutes'.

Cà fonctionne ... à peu près. En fait, j'ai mis le nez dedans parce qu'à
la rotation des logs, le nouveau fichier log est tout petit, et donc le
diff est gros !

Bref, dans la mesure où perl sait se positionner dans un fichier, je
pensais plutôt refaire ceci plus ou moins de la manière suivante :
Run 1, je note la taille du fichier et son n° d'inode.
Run 2, je relis le fichier de log depuis la position noté au run
précédent. Si le n° d'inode a changé, je lis depuis le début (et, cerise
sur le gâteau, si j'en suis capable, je lis la fin du fichier de log
précédent).

J'ai l'impression que tout ceci est hyper basique, et je m'attendais à
trouver un module tout fait sinon dans le perl embarqué sur mon serveur,
au moins sur le CPAN.

Mais je dois m'y prendre fort mal pour mes recherches, je n'ai quasiment
rien trouvé.

Il y a bien ce module : File::LogReader (Sur le CPAN) qui semble
répondre en partie à ma demande (et que je vais tester), mais avez vous
autre chose dans votre besace ?

Merci,
Pascal

5 réponses

Avatar
xavier
schirrms2 wrote:

Il y a bien ce module : File::LogReader (Sur le CPAN) qui semble
répondre en partie à ma demande (et que je vais tester), mais avez vous
autre chose dans votre besace ?



Pour ma part, j'utiliserais

<http://search.cpan.org/~cwest/ppt-0.14/bin/tail>
<http://search.cpan.org/~atripps/File-Tail-Multi-0.1/Multi.pm>
ou
<http://search.cpan.org/~dmuey/File-Tail-App-v0.0.3/App.pm>

--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Jethro Tull)
Avatar
schirrms2
Le 07/12/2011 23:17, Xavier a écrit :
Pour ma part, j'utiliserais

<http://search.cpan.org/~cwest/ppt-0.14/bin/tail>
<http://search.cpan.org/~atripps/File-Tail-Multi-0.1/Multi.pm>
ou
<http://search.cpan.org/~dmuey/File-Tail-App-v0.0.3/App.pm>



Merci pour cette réponse, mais il ne me semble pas que ces trois
librairies fassent l'affaire : elles surveillent le fichier en
permanence (comme tail, en fait), alors que 'mon' programme tourne
toutes les 5 minutes.

Cordialement,
Pascal
Avatar
Paul Gaborit
À (at) Wed, 07 Dec 2011 22:38:55 +0100,
schirrms2 écrivait (wrote):

Il y a bien ce module : File::LogReader (Sur le CPAN) qui semble
répondre en partie à ma demande (et que je vais tester), mais avez
vous autre chose dans votre besace ?



À vrai dire, je préfère lancer mes analyses de fichiers log lors de ses
rotations comme ça tout est synchronisé.

Et pour une granularité de 5 min, je pense que la méthode par 'tail' (ou
équivalent Perl) a du bon...

Ceci étant, File::LogReader semble faire exactement ce que vous
souhaitez. Il permet de stocker l'offset de lecture du fichier et de le
relire (s'il existe) lors de la prochaine ouverture du fichier.

Pour le coup du changement d'inode, il suffit de le vérifier avant
d'ouvrir le fichier avec File::LogReader.

Mais ce n'est pas obligatoirement la bonne méthode. Il est assez courant
d'effectuer une rotation de log via :

cat /dev/null > /var/log/fichier.log

comme ça le daemone qui alimente le log n'a même pas besoin d'être
prévenu. Et là, pas de changement d'inode.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
schirrms2
Le 08/12/2011 01:51, Paul Gaborit a écrit :

Il y a bien ce module : File::LogReader (Sur le CPAN) qui semble
répondre en partie à ma demande (et que je vais tester), mais avez
vous autre chose dans votre besace ?



Et pour une granularité de 5 min, je pense que la méthode par 'tail' (ou
équivalent Perl) a du bon...



Certes, mais ça demande donc un service, par rapport à un traitement
lancé toutes les 5 minutes. Possible, pas forcément souhaitable.

Ceci étant, File::LogReader semble faire exactement ce que vous
souhaitez. Il permet de stocker l'offset de lecture du fichier et de le
relire (s'il existe) lors de la prochaine ouverture du fichier.



C'est vrai, et mes premiers tests sont plutôt concluants.

Pour le coup du changement d'inode, il suffit de le vérifier avant
d'ouvrir le fichier avec File::LogReader.

Mais ce n'est pas obligatoirement la bonne méthode. Il est assez courant
d'effectuer une rotation de log via :

cat /dev/null> /var/log/fichier.log

comme ça le daemone qui alimente le log n'a même pas besoin d'être
prévenu. Et là, pas de changement d'inode.




Effectivement, je n'avas pas pensé à ça. Sur ma distro Linux, quasi tous
les services sont supervisés par sc, qui assure aussi la rotation des
logs, et ce à priori par recréation de fichiers (j'en suis quasi sur,
mais quasi n'est pas assez dans ce cas :-) )
De mani_re plus générale, mon idée ne serait donc pas applicable. Mais
dans ce cas, lemode natif de File::LogReader est OK, puisque si le
fichier est plus petit qu'à la rotation précédente, ou si le hash des
derniers octets à changé, il y a relecture depuis le début (Il est
d'ailleurs dommage que le développeur ait mis ceci au point et n'ait pas
songé à le préciser dans la doc ! Il faut ouvrit le code pour le savoir).

Merci,
Pascal
Avatar
Paul Gaborit
À (at) Sat, 10 Dec 2011 10:24:55 +0100,
schirrms2 écrivait (wrote):

Le 08/12/2011 01:51, Paul Gaborit a écrit :

Il y a bien ce module : File::LogReader (Sur le CPAN) qui semble
répondre en partie à ma demande (et que je vais tester), mais avez
vous autre chose dans votre besace ?





Et pour une granularité de 5 min, je pense que la méthode par 'tail' (ou
équivalent Perl) a du bon...



Certes, mais ça demande donc un service, par rapport à un traitement
lancé toutes les 5 minutes. Possible, pas forcément souhaitable.



Ne pas oublier non plus que si le traitement à faire toutes les 5 min
est lourd, il peut un jour durer plus de 5 minutes...

Ceci étant, File::LogReader semble faire exactement ce que vous
souhaitez. Il permet de stocker l'offset de lecture du fichier et de le
relire (s'il existe) lors de la prochaine ouverture du fichier.



C'est vrai, et mes premiers tests sont plutôt concluants.



Tant mieux.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>