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 :

Creation de fichier log


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Par défaut Creation de fichier log
    Bonjour,

    je suis occupé avec un projet scolaire et l'on doit écrire des classes. Le prof nous à donc fournis des fichiers qui permettent de tester ses classes. Plutot que de m'amuser à mettre en commentaire à chaque fois des partie du prof pour pouvoir tester des partie de mes classes, j'exécute tout d'un coup.
    J'ai donc mis des cout, cerr et clog un peu partout dans mes classes.

    Je cherchais donc le moyen de mettre les clog dans un fichier

    chose que j'ai réussi à faire grace à un code source
    Code C++ : 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
     
    class redirecter
    {
    public:
        redirecter(std::ostream & dst, std::ostream & src)
            : src(src), sbuf(src.rdbuf(dst.rdbuf())) {}
        ~redirecter() { src.rdbuf(sbuf); }
    private:
        std::ostream & src;
        std::streambuf * const sbuf;
    };
     
    int main()
    {
        std::ofstream log("hello-world.log");
        redirecter redirect(log, std::clog);
     
    /* Rajout de ma part
        pid_t pid;
     
        pid = fork();
        if(pid == 0){
            execv ("Test1", NULL);
        }
    */
     
        return 0;
    }

    Ce que je cherches à faire c'est créer un fichier main qui appel les fichiers du prof et que tout les clog s'écrivent du coup la aussi dans le fichier.
    Mais la je suis bloqué. Le probleme est que lorsque j'execute le main il appel bien mon fichier Test1 mais les clog du coup s'affichent à l'écran

    Comment résoudre cela?

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Janvier 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Russie

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 25
    Par défaut Utilisez les fonction popen()/pclose()
    Bonjour Sparky95,

    C'est mieux d'utiliser les fonctions popen()/pclose() ici, car ces sont plus simples que les fonctions fork()/vfork() et plus utiles pour votre but.
    Il faut que j'écrive les explications siffisantes, mais ce sera ma dette linguistique. J'ai simplement ajouté queque chose à votre code:

    https://www.jeremymorgan.com/tutoria...-command-in-c/
    https://stackoverflow.com/questions/...ecuted-to-cout

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    //main.cpp
     
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <cstdio>
    #include <array>
     
    class redirecter
    {
        public:
     
        redirecter(std::ostream & dst, std::ostream & src)
            : src(src), sbuf(src.rdbuf(dst.rdbuf())) {}
        ~redirecter() { src.rdbuf(sbuf); }
     
        private:
     
        std::ostream & src;
        std::streambuf * const sbuf;
    };
     
    int main()
    {
        std::ofstream log("hello-world.log");
        redirecter redirect(log, std::clog);
     
        std::clog << "Main started" << std::endl;
     
        std::string command("./test1");
        command.append(" 2>&1");
     
        std::array<char, 128> buffer;
        std::string result;
     
        std::clog << "Opening reading pipe" << std::endl;
     
        FILE* pipe = popen(command.c_str(), "r");
        if (!pipe)
        {
            std::cerr << "Couldn't start command." << std::endl;
            return 0;
        }
     
        while (fgets(buffer.data(), 128, pipe) != NULL)
        {
            std::clog << "Reading..." << std::endl;
            result += buffer.data();
        }
        auto returnCode = pclose(pipe);
     
        std::clog << "result = " << result << std::endl;
        std::clog << "resultCode = " << returnCode << std::endl;
     
        std::clog << "Main is exiting" << std::endl;
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //test1.cpp
     
    #include <iostream>
     
    int main()
    {
        std::clog << "C'est Test1" << std::endl;
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    g++ -o test1 test1.cpp
    g++ -o main main.cpp -std=c++11

  3. #3
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Par défaut
    bonjour,
    à priori c'est ce que je cherches je n'ai pas le temps de le tester maintenant mais merci beaucoup pour la réponse super

  4. #4
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Par défaut
    Bonjour,
    Je déterres cette réponse car ce n'est pas tout à fait ce que je cherchais au final.
    les clog se mettent bien dans le fichier hello-world.log
    le soucis est que si je fais des cout, eux aussi se rajoutent dans le fichier et de plus ne s'affichent pas à l'écran
    https://prnt.sc/p7yvmo
    Merci

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Janvier 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Russie

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 25
    Par défaut
    Citation Envoyé par Sparky95 Voir le message
    des cout, eux aussi se rajoutent dans le fichier
    Bonjour,
    Dans ce cas c'est plus facile d'utiliser la redirection de stderr vers le fichier log et sans objet de class "redirector":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //test1.cpp
    #include <iostream>
     
    int main()
    {
        std::cout << "(vers cout) C'est Test1" << std::endl;
        std::clog << "(vers clog) C'est Test1" << std::endl;
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //main.cpp
     
        //std::ofstream log("hello-world.log");
        //redirecter redirect(log, std::clog);
     
       ...
     
        //command.append(" 2>&1");
     
       ...
     
        std::cout << "(vers cout main) result = \n" << result << std::endl;
    La redirection de stderr vers le fichier log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ./main 2> hello-world.log
    C'est pour Linux. Quant à Windows, il vaut mieux faire un "thread" séparé pour "logging".
    Il y a un autre moyen pour Linux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    { ./test1; ./test2; ./test3; } 2>hello-world.log
    Mais c'est plus bash que c++ (attention aux espaces).

  6. #6
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Par défaut
    Nickel c'est plus ce que je cherchais mis par par évidemment que je doivent le faire via bash :/
    N'y a-t-il pas moyen que la partie 2> hello_world.log soit mis dans le code du main? :s

    J'ai essayé comme ça command.append(" 2> hello-world.log"); mais cela ne fonctionnes pas

    AJOUT => je viens de capter pq cela ne fonctionnes pas :p par contre je j'ai pas encore d'idée de comment le faire mise à part peut-être.
    avec un main paramètre
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(int n, char *params[]){
        if(params[0] == NULL){
            std::string command("./main 2> ");
            command.append(" 2> hello-world.log");
        }else{
            //le code
        }
        return 0;
    }

    Voila au final comment je l'ai fais =>https://prnt.sc/p95mvk
    J'imagines qu'il y à des manières plus propres de le faire mais bon cela fonctionnes

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

Discussions similaires

  1. Creation visite à partir d'un fichier Log
    Par Abou Oubayd'Allah dans le forum Général Java
    Réponses: 5
    Dernier message: 02/11/2016, 15h46
  2. la creation de fichier log en c
    Par mipou dans le forum C
    Réponses: 13
    Dernier message: 16/05/2009, 17h58
  3. [Log4j]Cherche visualiseur de fichiers logs de log4j
    Par RolandB dans le forum Logging
    Réponses: 9
    Dernier message: 18/03/2009, 15h11
  4. creation de fichiers log pour chaque table
    Par khalid_kha dans le forum Administration
    Réponses: 3
    Dernier message: 18/08/2008, 18h16
  5. [] [Stratégie] Comment créer un fichier log
    Par Skeezo dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 16/09/2002, 18h30

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