IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Script qui scrute des log


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut Script qui scrute des log
    Bonjour,

    Etant nouveau dans le monde de perl je viens chercher de l'aide sur ce forum..
    PI, j'ai essayer de fouiller sur le net mais sans succès...

    Je cherche à scruter un fichier de log (que je passe en argument) et je cherche le mot ERROR pour créer un second fichier (que je passe en second argument) qui contient toutes les lignes avec le mot ERROR dedans... Bien evidement ce script va évoluer au fur et a mesure donc je pense que je vais passer un peu de tps avec vous messieurs

    Ci-dessous le script..

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/usr/bin/perl -W
     
    use Carp;
    use strict;
    use File::LogReader;
     
    #argument 1 fichier de log a vérifier
    my $filename = $ARGV[0];
    print "arg 1: $filename\n";
     
    #fichier resultat
    my $fileresultname = $ARGV[1];
    print "arg 2: $fileresultname\n";
     
    #ouverture du fichier pour ecriture
    open(RESULT,">$fileresultname") || die ("Erreur de creation du fichier $fileresultname");
     
    my $lr = File::LogReader->new( filename => $filename );
    while( my $line = $lr->read_line ) {
          if (grep(/ ERROR /,$line)) {print RESULT "$line\n";}
     
        }
    $lr->commit;
     
    close(RESULT);

    Les 2 arguments sont bien saisies, le nouveau fichier est bien crée mais il est vide.. Je ne vois pas pk...
    Oui la chaine de caractére " ERROR " est bien présente dans mon fichier d'origine ...

    Je pense que cela vient des 2 arguments qui sont saisies mais je bloque...
    Merci

    V

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    La fonction grep de Perl ne fais pas ce que tu crois sans doute.

    Par ailleurs, le motif:
    recherche le mot 'ERROR' précédé et suivi d'un espace blanc. Il n'y a sans doute pas (ou pas toujours) d'espace avant et après ERROR dans ton fichier de log

    Essaie de remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (grep(/ ERROR /,$line)) {print RESULT "$line\n";}
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print RESULT $line if $line =~ /ERROR/;
    Si ça ne marche toujours pas, poste un petit extrait de ton fichier de log.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Merci Lolo78,

    Pareil

    Je ne pense pas que cela vienne de mon if car le script fonctionné avant que je mette des argument en entrée pour ARGV 0 & 1... Avant il y avait des constantes..

    Fichier de log

    ......
    09-10-2015 09:54:20 ERROR - MESSAGE - MESSAGE LONG
    09-10-2015 09:54:20 ERROR - MESSAGE - MESSAGE LONG
    ......

    Chris

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Hum, je ne vois pas d'erreur manifeste.

    Essaie de tester en remplaçant la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (grep(/ ERROR /,$line)) {print RESULT "$line\n";}
    par quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "Je viens de lire la ligne: $line\n";
    Cela permettra de savoir si le programme lit bien le fichier en entrée ou non, et le fait bien ligne par ligne, afin de savoir quelle partie du script ne fonctionne pas comme espéré.

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Good idea...
    Je n'ai pas de réflexe de ce genre encore.... Je teste cela et reviens vers toi ...

    Merci en tt cas

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je changerais aussi cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( my $line = $lr->read_line ) {
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( defined(my $line = $lr->read_line) ) {
    Sinon, la boucle va s'arrêter dès la première ligne "vide" (chaine vide est faux).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Cela dit, chez moi, même le script d'origine de chris fonctionne et retourne un fichier "non vide".
    (la modif du grep proposée par Lolo me semble par contre à faire ; la syntaxe et la sémantique utilisée dans ton if(grep ...) est correcte, mais on n'utilise grep pour filtrer des données sur des tableaux comprenant plus d'un élément, et dans ton cas, il n'y a que l'élément $line).

    Quelle version de perl et du module File::LogReader utilises-tu ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Merci à tous pour vos réponses...

    Alors la version utilisé pour LogReader est la $VERSION = '0.04'. Pour perl c'est la 5.

    J'ai fais les changements que vous m'avez indiqué mais même problème..
    J'ai fais une petite modif afin de savoir ou le script bloque..


    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    #!/usr/bin/perl -W
     
    use Carp;
    use strict;
    use File::LogReader;
     
     
    #fichier a surveiller
    my $filename = $ARGV[0];
    print "arg 1: $filename\n";
     
    #fichier resultat
    my $fileresultname = $ARGV[1];
    print "arg 2: $fileresultname\n";
     
    #ouverture du fichier pour ecriture
    open(RESULT,">$fileresultname") || die ("Erreur de creation du fichier $fileresultname");
    print "ouverture OK:\n";
    my $lr = File::LogReader->new( filename => $filename );
    print "lecture OK :\n";
    while( defined(my $line = $lr->read_line) ) {
    print "apres while:\n";
    #      if (grep(/ ERROR /,$line)) {print RESULT "$line\n";}
            print "Je viens de lire la ligne: $line\n";
    close(RESULT);
        }
    $lr->commit;
     
    close(RESULT);

    Voici le retour de mon script:

    arg 1: /tmp/test/debug.log
    arg 2: /tmp/test/error.log
    ouverture OK:
    lecture OK :


    Il n'arrive pas à rentrer dans le while...
    Je deviens fou !

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Avant la ligne 21
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $lr = File::LogReader->new( filename => $filename );
    Pourrais-tu ajouter celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "$filename is ", (-r $filename ? "" : "not "), "readable\n";
    Vu que le script tourne chez moi, j'opterais pour un problème d'environnement (commande d'appel, droit du fichier, système d'exploitation).
    Sur quel système tourne-tu et avec quelle implémentation de perl ? (windows ? cygwin/perl, strawberry perl, activeperl ? Linux ?)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #10
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Messieurs,

    Vous allez me détester....

    Je ne sais pas pour quelle raison mais on dirait que dès que je crée un nouveau fichier avec un chaine ERROR dedans cela fonctionne.... mais qu'une seule fois.... Si je désire le re-executer... Il ne veut rien savoir....
    Je cherche à mettre en variable la chaine de caractère que l'ont doit rechercher.. Une fois que cela est fait je vous le mets en PJ du post....

    Merci pour l'aide.. C'est très appréciable

    Cordialement,
    Chris

  11. #11
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Hum, la logique de File::Logreader, c'est qu'il ne lit qu'une seule fois les lignes (il ne relit pas les lignes déjà lues, seulement celles qui ont été ajoutées depuis la dernière lecture). Je ne sais pas comment c'est implémenté, mais c'est peut-être à cause de cela: si tu lui repasses le même fichier, il ne lit plus rien. Bon juste une hypothèse comme ça...

  12. #12
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    En regardant la doc du module, je crois qu'on comprend facilement comment le module mémorise l'information de lecture :
    METHODS
    new
    Create a new object. Options:

    filename
    The name of the file to read from

    state_dir
    A directory to store state files. Defaults to ~/.logreader

    Bravo Laurent
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  13. #13
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Tout a fait !

    Si je lui repasse en entrée le même fichier sans aucune modif il ne me ressort rien... Logique ^^
    Si je rajoute des lignes dans mon fichier d'entrée avec la chaîne recherchée, il me génère un autre fichier....


    Je remet donc le script qui fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/usr/bin/perl -W
     
    use Carp;
    use strict;
    use File::LogReader;
    use POSIX qw(strftime);
     
     
    #fichier a surveiller
    my $filename = $ARGV[0];
     
    #fichier resultat
    my $fileresultname = $ARGV[1];
     
    #valeur a rechercher
    my $find = $ARGV[2];
     
    #ouverture du fichier pour ecriture
    open(RESULT,">$fileresultname") || die ("Erreur de creation du fichier $fileresultname");
    print "ouverture ok \n";
    my $lr = File::LogReader->new( filename => $filename );
    while( defined(my $line = $lr->read_line) ) {
            if (grep($find,$line)) {print RESULT "$line\n"}
        }
    $lr->commit;
     
    close(RESULT);

    Merci pour votre aide ! Content d'avoir compris la démarche en tt cas
    Sans doute à bientôt !

  14. #14
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Dans ton script qui marche, je t'invite à éviter l'usage "détourné" de grep pour utiliser le simple test de Lolo.
    Ça ne changera pas grand chose dans l'exécution de ton script, mais ce sera utile pour ton apprentissage du langage
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. script qui redimentionne des images
    Par gaet-gaet dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 29/04/2010, 13h48
  2. Un script qui renvoie des erreurs lorsqu'en tâche planifiée
    Par annedeblois dans le forum Sécurité
    Réponses: 0
    Dernier message: 07/10/2009, 15h31
  3. script qui crée des fichiers
    Par Emcy dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 10h28
  4. comment trouver le script qui envoye des spam a partir de mon compte
    Par maya24 dans le forum Autres hébergeurs
    Réponses: 3
    Dernier message: 16/10/2007, 17h19
  5. [GD] Problème de script qui génère des miniatures de photos
    Par Panama dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 30/01/2007, 18h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo