1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : mars 2015
    Messages : 75
    Points : 61
    Points
    61

    Par défaut [REGEX] Blocage suite parsing ligne de grande taille

    Bonjour,

    je dois lire un fichier de log JBoss pour rechercher le motif suivant :'Deployed "edit-gateway.war"'.
    Tout se passe bien en général, sauf quand ce fichier de log contient des lignes de très grande taille : cela arrive quand le service est redémarré suite à un problème en journée. Un exemple de ce type de ligne est fourni en pièce jointe, longueur 56906 caractères, incluant notamment le caractère +, quantificateur d'expressions régulières, le séparateur /...

    La recherche du motif se passe bien lorsqu'il n'y a pas ces énormes lignes, commençant toutes par 'Payload'.
    Si présentes, le programme semble se figer et ne rend plus la main, bloquant toutes les autres traitements à suivre. Le dernier blocage a été constaté au matin à 8 heures, le programme de recherche de motif ayant démarré la veille à 18h30.

    Pour que cela fonctionne et que le programme ne se bloque plus, j'ai modifié le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      foreach $record ( reverse(<FILER1>) ) {
        chomp($record);
        if ( ($record =~ /.*${patternWarning}.*/i)
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      foreach $record ( reverse(<FILER1>) ) {
        next if $record =~ /^Payload:/;
        chomp($record);
        if ( ($record =~ /.*${patternWarning}.*/i)
    Ce contournement a réglé notre problème, car le motif recherché n'est pas dans ce lignes du type 'Payload', mais pour ma culture personnelle, est-ce que j'utilise mal l'expression régulière, est-ce une limitation du moteur d'expressionsrégulières, ... ?

    Merci pour vos lumières.
    ps : un exemple de ligne est fourni dans le fichier joint
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    août 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : août 2005
    Messages : 618
    Points : 978
    Points
    978

    Par défaut

    Bonjour

    il est possible d'améliorer l'expression régulière en supprimant les .* qui ne servent à rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ($record =~ /${patternWarning}/i)
    puisque perl cherche déjà le pattern sur toute la ligne, même si je ne pense pas que cela soit la cause de ton problème.

    Est-ce que tu as pu reproduire ce problème en utilisant le bout de code et le fichier que tu as donné ? Je n'ai eu aucun problème de mon côté. D'ailleurs, une ligne de cette taille n'est pas un problème, à moins d'avoir un ordi très limité !

    Si on cherche dans une autre direction, est-il possible que le fichier de log soit modifié pendant que le script tourne ?
    Le script perl tourne-t-il sur la même machine que celle du log (même OS) ?
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : mars 2015
    Messages : 75
    Points : 61
    Points
    61

    Par défaut

    Bonjour,

    Citation Envoyé par Gardyen Voir le message
    Est-ce que tu as pu reproduire ce problème en utilisant le bout de code et le fichier que tu as donné ? Je n'ai eu aucun problème de mon côté. D'ailleurs, une ligne de cette taille n'est pas un problème, à moins d'avoir un ordi très limité !

    Si on cherche dans une autre direction, est-il possible que le fichier de log soit modifié pendant que le script tourne ?
    Le script perl tourne-t-il sur la même machine que celle du log (même OS) ?
    J'ai reproduit plusieurs fois le problème sur une copie à l'identique du fichier de log et sur une seconde copie ne contenant qu'une ligne à problème.

    Ce script de recherche de motif est lancé sur la même machine que le fichier de log, juste après le démarrage du service pour vérifier le déploiement des applications.
    Le fichier de log peut donc être modifié pendant que le script tourne, mais en situation normale, cela ne pose aucun problème.

    Merci

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : mars 2015
    Messages : 75
    Points : 61
    Points
    61

    Par défaut

    Citation Envoyé par Gardyen Voir le message
    il est possible d'améliorer l'expression régulière en supprimant les .* qui ne servent à rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ($record =~ /${patternWarning}/i)
    puisque perl cherche déjà le pattern sur toute la ligne, même si je ne pense pas que cela soit la cause de ton problème.
    J'ai suivi ton conseil pour tenter de faire fonctionner cet ancien programme en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ($record =~ /.*${patternWarning}.*/i)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ($record =~ /$patternWarning/i)
    et maintenant il fonctionne parfaitement, la construction de l'expression régulière posait donc bien un problème.

    Merci de m'avoir mis sur la voie

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

Discussions similaires

  1. nombre de lignes fichier txt (très grande taille)
    Par bougnbie dans le forum Linux
    Réponses: 4
    Dernier message: 15/02/2013, 18h26
  2. Réponses: 21
    Dernier message: 17/12/2012, 15h38
  3. problème de conversion de très très grande taille !
    Par Conficius dans le forum Langage
    Réponses: 2
    Dernier message: 05/11/2005, 22h14
  4. Réponses: 6
    Dernier message: 19/10/2004, 13h46
  5. [firebird 1.5] Probleme sur tables de grande taille
    Par iguanevif dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2004, 13h33

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