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 :

Automatisation de rapport serveur en Perl


Sujet :

Langage Perl

  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut Automatisation de rapport serveur en Perl
    Bonjour,

    Tout d'abord je tient à vous informer que je suis débutant dans ce language.

    Je doit effectuer un travail et j'aurais besoin d'aide il conciste à:

    Analyser un fichier log et détecter si le serveur a bien fait la sauvegarde il ce présente comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Total        Copi‚s     Ignor‚s  Diff‚rences       checs     Suppl‚m.
         R‚p. :      205          0         205         0              0         
     Fichiers :     493          0         493          0              0        
       Octets :   1.06 m       0        1.06 m      0              0         
       Dur‚es :   0:00:03    0:00:00               0:00:00          0:00:03
    
        Fin : Tue Jun 09 20:30:48 2009
    Ce qui est en gras indique qu'il n'y a pas d'érreurs si il y a un 1 à la place j'aimerais qu'il m'alerte.

    D'autre part un fichier log ce crée pour chaque jour de la semaine, j'aimerais qu'il analyse le fichier log du jour même le nom du fichier log ce présentant comme sa : OutFile+la date du jour par exemple pour mardi : OutFileMARDI.

    Si le fichier log n'a pas été créé ce jours la sauvegarde a donc échoué et il faut qu'il alerte également.

    J'attend vos avis, merci d'avance

  2. #2
    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 : 59
    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
    Par défaut
    Quelque chose comme ceci devrait être une bonne base :
    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
     
    use strict;
    use warnings;
     
    # Liste des jours de la semaine
    my @jours = qw(DIMANCHE LUNDI MARDI MERCREDI JEUDI VENDREDI SAMEDI);
    # Jour d'aujourd'hui (localtime retourne la date d'aujourd'hui, le 6e index du tableau retourné donne le jour dans la semaine)
    my $aujourdhui = $jour[$[localtime]->[6]];
    # Fichier de log
    my $fichier_log = "OutFile$aujourdhui";
     
    # on teste si le fichier de log est "readable" (opérateur -r)
    die "Pas de log pour aujourd'hui ($fichier_log)" if !-r $fichier_log;
     
    # on affiche les lignes du fichier qui contiennent des nombres positifs dans les 2 dernières positions de chaque ligne
    open my $LOG, "<", $fichier_log;
    foreach my $line (<$LOG>) {
      if (my ($comment, $echec, $supplem) = $line =~ /^([^:]).*(\d+)\s+(\d+)\s*$/) {
        print "$comment contient des erreurs\n" if $echec + $supplem > 0;
      }
    }
    Je ne l'ai pas testé, il ne reste donc qu'à tester et debuguer

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Merci pour cette réponse rapide En fait j'ai effectivement corriger quelques petites choses, maintenant il y a cette deuxième partie quer je n'arrive pas du tout à faire fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # on affiche les lignes du fichier qui contiennent des nombres positifs dans les 2 dernières positions de chaque ligne
    open my $LOG, "<", $fichierlog;
    foreach my $line (<$LOG>) {
      if (my ($comment, $echec, $supplem) = $line =~ /^([^:]).*(\d+)\s+(\d+)\s*$/) {
        print "$comment contient des erreurs\n" if $echec + $supplem > 0;
      }
    }
    En fait dans mon fichier log il y a plusieurs de ces tableaux mais sa ne marche pas du tout, on ma dit d'utiliser les expressions régulières ou motifs mais je ne sais pas comment sa fonctionne. Je joint mon fichier log peut être que sa pourra vous éclairer
    Fichiers attachés Fichiers attachés

  4. #4
    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 : 59
    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
    Par défaut
    Ceci est justement une expression régulière :
    /^([^:]).*(\d+)\s+(\d+)\s*$/

    Qui signifie :
    - depuis le début de ligne
    - capturer tous les caractères sauf ":" autant de fois que possible
    - chercher n'importe quel caractère autant de fois que possible
    - capturer un nombre
    - chercher des espaces
    - capturer un nombre
    - chercher éventuellement des espaces et la fin de ligne

    Si une ligne du fichier log "match" ce motif, les variables ($comment, $echec, $supplem) sont respectivement affectées avec les captures décrites dans l'explication du motif.

    Il se trouve qu'avec ce motif, et l'exemple de fichier log que tu as fourni, il y a deux lignes supplémentaires qui correspondent au motif, sans contenir d'erreur :
    Fin : Tue Jun 09 20:30:42 2009
    et
    D‚but : Tue Jun 09 20:30:42 2009

    Deux solutions donc :
    - soit trouver un motif plus restrictif
    - soit vérifier la correspondance au motif dans une zone du fichier plus restreinte.

    Ne connaissant pas précisément le format du fichier, il est difficile de faire un choix parfait.
    Néanmoins, on peut supposer que dès lors que l'on atteind la ligne contenant "Fin :", il est possible de ne plus contrôler la fin du log.
    Il suffirait alors d'ajouter la ligne suivante en début de foreach :

  5. #5
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    En fait debut et fin ne corresponde pas au rapport sans erreurs. D'autre part le format du fichier est .log correspondant a un fichier texte. Concernant l'expression réguliére que tu ma fourni elle devrait marcher, c'est la que je ne comprend pas pourquoi dans un rapport sans erreurs que je lui donne il m'affiche qu'il en contient.

  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 : 59
    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
    Par défaut
    Je viens juste de t'expliquer l'expression régulière est trop large (ou est appliquée sur des éléments pour lesquels elle ne devrait pas), et je t'ai donnée des solutions pour corriger le tir.

    Quant au format du fichier, le simple fait de donner son extension .log ne renseigne pas sur le format de son contenu. Les motifs des expressions régulières ne peuvent être écrits sans connaitre la syntaxe (le format) des lignes contenues dans le fichier.

    Par ailleurs, pourrais-tu indiquer plus précisément les erreurs que le programme te remonter et fournissant aussi le fichier log qui a généré ces erreurs non voulues ?

  7. #7
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Je vais essayer de te fournir un fichier log avec des erreurs je vais chercher sa

  8. #8
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    En fait j'ai pas de log avec des erreurs mais quand il y a une erreur un 1 s'affiche. Le soucis c'est que des 1 il peut y en avoir dans les dates etc... N'esxisterait-il pas une expression régulière qui fait que quand il y a un 1 sans rien devant et sans rien derrière il affiche une erreur ?

    EDIT : En fait des 1 sans rien devant et sans rien derrière il y en a dans le rapport qui n'ont rien avoir avec des erreurs donc ce n'est pas bon non plus

  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 : 59
    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
    Par défaut
    Bien sur qu'il est possible de chercher un 1 isolé... mais est-ce bien ainsi que le format du fichier est fait. Par exemple, la position où il y a des erreurs peut-elle prendre quelles valeurs : 0, 1, mais aussi 2, 3, ou plus ???

    Relis moi bien, j'ai dis qu'il y avait 2 façon de faire (au moins) :
    - la première est de trouver une expression régulière plus restrictive
    - la deuxième est de ne traiter l'expression régulière que sur les lignes du tableau

    Tu peux donc "ignorer" les lignes contenant "Debut" et "Fin", avec par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    next if /^\s*(Debut|Fin)\s*/;
    Tu peux aussi limiter la recherche de motif sur cette condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Ne traiter que les lignes entre une ligne commençant par Total et une ligne vide (soit le contenu d'un tableau)
    if (/^Total/ .. /^\s*$/) {
      ...
    }

  10. #10
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Ce que tu a dit m'interesse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Ne traiter que les lignes entre une ligne commençant par Total et une ligne vide (soit le contenu d'un tableau)
    if (/^Total/ .. /^\s*$/) {
      ...
    }
    Je voudrais traiter les lignes commencant par Total et finissant par fin qui contienne des nombres supérieurs à 0 (il n'y a pas que des 1) et isolé pense tu que c'est possible ?

    Et au fait c'est de l'ASCII du texte quoi truc basique.

  11. #11
    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 : 59
    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
    Par défaut
    Si tu utilises ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # on affiche les lignes du fichier qui contiennent des nombres positifs dans les 2 dernières positions de chaque ligne
    open my $LOG, "<", $fichierlog;
    foreach my $line (<$LOG>) {
      if (/^Total/ .. /^\s*Fin\s*/) {
        if (my ($comment, $echec, $supplem) = $line =~ /^([^:]).*(\d+)\s+(\d+)\s*$/) {
          print "$comment contient des erreurs\n" if $echec + $supplem > 0;
        }
      }
    }
    En remplacement de l'ancien, ça devrait fonctionner.
    Si ça ne fonctionne pas, montrer ici clairement l'erreur que tu obtiens.

  12. #12
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    En fait il y a plein d'écritures qui défile donc j'avais l'espoir que ça fonctionne mais quand je rajoute une erreur moi même (que je met un 1 à la place d'un 0) il ne m'affiche pas que ça contient une erreur

  13. #13
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    N'est-il pas possible que quand il y a un nombre supérieur à 0 isolé uniquement entre Total et Fin il m'affiche une erreur ?

  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 : 59
    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
    Par défaut
    C'est tout l'objet du script que je t'ai donné.
    Pourrais-tu donner le script que tu utilises ? Normalement, il ne devrait afficher QUE les lignes avec des erreurs !

  15. #15
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    J'utilise exactement ce script :

    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
    use strict;
    use warnings;
     
    # Liste des jours de la semaine
    my @jours = qw(DIMANCHE LUNDI MARDI MERCREDI JEUDI VENDREDI SAMEDI);
    # Jour d'aujourd'hui (localtime retourne la date d'aujourd'hui, le 6e index du tableau retourné donne le jour dans la semaine)
    my $aujourdhui = qw(DIMANCHE LUNDI MARDI MERCREDI JEUDI VENDREDI SAMEDI)[(localtime)[6]];
    # Fichier de log
    my $fichierlog = "OutFile$aujourdhui.log";
     
     
    # on teste si le fichier de log est "readable" (opérateur -r)
    # Lecture du fichier
    open ( my $FH, '<', $fichierlog ) or die("Impossible de lire $fichierlog");
     
    # on affiche les lignes du fichier qui contiennent des nombres positifs dans les 2 dernières positions de chaque ligne
    open my $LOG, "<", $fichierlog;
    foreach my $line (<$LOG>) {
      if (/^Total/ .. /^\s*Fin\s*/) {
        if (my ($comment, $echec, $supplem) = $line =~ /^([^:]).*(\d+)\s+(\d+)\s*$/) {
          print "$comment contient des erreurs\n" if $echec + $supplem > 0;
        }
      }
    }

  16. #16
    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 : 59
    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
    Par défaut
    Le premier open devrait être remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    die "Pas de log pour aujourd'hui ($fichierlog)" if !-r $fichierlog;
    Ensuite, peux-tu donner la commande que tu lances pour exécuter le script, et un bout du résultat à l'écran... et fournir aussi le fichier log qui a provoqué ce résultat (car je ne peux pas tout deviner à distance).

  17. #17
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Je vais remplacer le premier open et te donner tout ce que tu demande demain car je ne suis pas au bureau. Bonne soirée

    EDIT : Pour utiliser le script, j'utilise la commande : perl nomduchier.pl dans une fenêtre dos.

    Le fichier log est trop gros et ne rentre pas en piéce jointe je peux te le faire parvenir par e-mail dès demain si tu me l'envoi en mp et encore une fois pour tout ce que tu fait merci

  18. #18
    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 : 59
    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
    Par défaut
    Citation Envoyé par aurelien13008 Voir le message
    EDIT : Pour utiliser le script, j'utilise la commande : perl nomduchier.pl dans une fenêtre dos.
    J'attends le script ici-même... mais je suis surpris dès maintenant que le nom du fichier ne soit pas fourni en paramètre...

  19. #19
    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 : 59
    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
    Par défaut
    Dans le script que tu m'as envoyé (qui doit correspondre au dernier script que tu as posté ici), tu n'as pas fait la correction demandée au message #16.

  20. #20
    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 : 59
    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
    Par défaut
    Ensuite, il y a une erreur grossière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if (/^Total/ .. /^\s*Fin\s*/) {
    à remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if ($line =~ /^\s*Total/ .. $line =~ /^\s*Fin\s*/) {
    Par ailleurs, comme ta description du fichier log était incomplète, la recherche de "Total" est erronnée, il faut admettre qu'il puisse y avoir des espaces avant (corrigé ci-dessus).
    Enfin, la capture du premier champ d'une ligne contenant des erreurs est erronée.
    Néanmoins, en ayant visionné ton fichier log, je doute que l'affichage de ce premier champ te soit suffisante, car il existe bien d'autres lignes avec ce même champ. J'ai donc ajouté l'affichage du numéro de ligne, et de la ligne complète.

    Enfin, après essai, la condition de fin de tableau (recherche de Fin), inclue dans ce groupe de ligne, la ligne Fin qui contient une date qui permet de faire la correspondance avec le motif. Il faut donc exclure cette dernière ligne.

    Ceci donne ce script :
    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
    28
    29
    30
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use English;
     
    $/ = "\r\n"; # Pour les fichiers texte DOS/Win32
     
    # Liste des jours de la semaine
    my @jours = qw(DIMANCHE LUNDI MARDI MERCREDI JEUDI VENDREDI SAMEDI);
    # Jour d'aujourd'hui (localtime retourne la date d'aujourd'hui, le 6e index du tableau retourné donne le jour dans la semaine)
    my $aujourdhui = qw(DIMANCHE LUNDI MARDI MERCREDI JEUDI VENDREDI SAMEDI)[(localtime)[6]];
    # Fichier de log
    my $fichierlog = "OutFile$aujourdhui.log";
     
    # on teste si le fichier de log est "readable" (opérateur -r)
    # Lecture du fichier
    die "Pas de log pour aujourd'hui ($fichierlog)" if !-r $fichierlog;
     
    # on affiche les lignes du fichier qui contiennent des nombres positifs dans les 2 dernières positions de chaque ligne
    open ( my $LOG, '<', $fichierlog ) or die("Impossible de lire $fichierlog");
    while (my $line = <$LOG>) {
      chomp($line);
      my $dans_la_table = $line =~ /^\s*Total/ ... $line =~ /^\s*Fin\s*/;
      if ($dans_la_table && $dans_la_table !~ /E0/) {
        if (my ($comment, $echec, $supplem) = $line =~ /^([^:]+).*(\d+)\s+(\d+)\s*$/) {
          printf "%03d: $comment contient des erreurs ($line)\n", $NR if $echec + $supplem > 0;
        }
      }
    }

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/10/2008, 15h30
  2. Automatisation des Rapports Studio Cognos 8.3
    Par youean dans le forum Cognos
    Réponses: 4
    Dernier message: 22/08/2008, 17h13
  3. [BO Xi][Webi] Automatisation de rapports Webi
    Par pbaryga dans le forum Webi
    Réponses: 10
    Dernier message: 21/01/2008, 17h01
  4. Réponses: 0
    Dernier message: 18/11/2007, 21h53
  5. Réponses: 1
    Dernier message: 07/10/2005, 10h24

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