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

 C++ Discussion :

scanner un fichier de log (eof) à la manière d'un tail


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 91
    Par défaut scanner un fichier de log (eof) à la manière d'un tail
    Bonjour,

    je cherche à réaliser une fonction qui lit en continu un fichier de log à la manière d'un tail en C/C++. Le programme tourne sur Red Hat (RHEL5).
    Je dois ensuite extraire une chaîne de caractères dès qu'une certaine chaîne est trouvée. Je débute en C/C++, je développe cette application dans le cadre d'un stage.

    Pour le moment, je n'ai pas de solution mais des pistes :

    - system("tail -f -n 1 /chemin/log");
    - select()

    je n'ai pas de retour sur la commande system().

    J'ai regardé la fonction select() et je ne la comprends pâs encore très bien...

    Que pouvez-vous me conseillez pour mon affaire ?

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    C'est de la manipulation de fichier. Peut-être que la fonction popen aussi pourrait t'intéresser.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 91
    Par défaut
    je vous remercie pour la fonction popen

    j'ai bien récupéré le résultat d'une commande tail sauf que la sortie est en stdout. Or je souhaite récupérer le résultat de la commande popen dans une variable de type string.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    string tailCmd = "tail -f -n 1 /var/log/dhcdp.log";
    FILE *f; 
    char buffer[BUFSIZ];
     
    if ( (f = popen(tailCmd.c_str(), "r")) == NULL )  // ouverture
        fprintf(pxeLog, "%s", "5) Scan log dhcp OK \n");
    exit(1); 
     
    while ( fgets(buffer, BUFSIZ, f) != NULL ) 
            fputs(buffer, stdout);  //fonctionne dans le log sysout
            fputs(buffer, scan);  // ne fonctionne pas
    pclose(f); // fermeture

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Ton code est incomplet. Je ne peux pas voir d'où vient l'erreur.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 91
    Par défaut
    j'ai extrait le code en cours de test. Le reste est insignifiant (un main() et un daemonloop() avec un while sans fin.

    Le programme est géré comme un service par un script /etc/init.d/ spécifique contenant les fonctions start-stop-restart.

    Je ne vois pas comment récupérer la valeur de retour de la commande popen dans une variable. Je souhaite ensuite filtrer la chaîne de caractère.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Le problème, autant que je sache, est que l'on ne peut pas utiliser select() pour être prévenu de l'insertion de caractères supplémentaires à la fin d'un fichier, car select() a surtout été prévu pour prévenir le processus de la possibilité d'action sur un descripteur de fichier. Autrement dit, la fonction surveille tous les appels potentiellement « bloquants » et rend la main dès que l'un d'eux ne l'est plus.

    Or, un fread() quelconque en fin de fichier a pour effet de rendre la main en positionnant le flag lu par feof(). En allant chercher les sources de « tail », on s'aperçoit que cette commande fait du polling, en vérifiant le contenu du fichier chaque seconde.

    C'est donc une lacune historique d'UNIX. Il faut donc se rabattre sur les mécanismes éventuels propres au système d'exploitation que tu utilises. Le noyau Linux en particulier propose inotify pour combler ces manques.

Discussions similaires

  1. [tomcat 5] [paramétrage] fichier de log System.out.println
    Par Aldo dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 22/02/2005, 14h41
  2. [Oracle 8i/Fichier de log] - fichier log pour analyse erreur
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 4
    Dernier message: 25/01/2005, 19h06
  3. [Tomcat] Fichier de logs
    Par yolepro dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 22/03/2004, 16h20
  4. Fichiers de Log
    Par Mouse dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/05/2003, 18h06

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