Bonjour à tous,
Je développe actuellement une application en C++, j'ai intégré une librairie de gestion des log (log4cpp) très pratique : j'en suis ravi.
Cependant j'utilise encore pas mal de librairies un peu obsolètes qui sont remplies de "cout" et "cerr". De plus j'utilise parfois (et c'est mal !) l'appel system().
Bref, afin de garder des logs propres et de ne pas éparpiller mes informations, j'ai cherché à réunir tous les flux sur les mêmes fichiers : appelons-les cout.std et cerr.log
Pour réunir tous mes flux, je n'ai trouvé d'autre solution qu'utiliser la primitive C freopen()
j'ai donc :
Remarquez que le fichier cout.std contient tout (stdout+stderr)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 FILE *stdoutToStdStream = freopen( "cout.std", "a+", stdout ); FILE *stderrToStdStream = freopen( "cout.std", "a+", stderr ); FILE *stderrToLogStream = freopen( "cerr.log", "a+", stderr );
tandis que le fichier cerr.log ne contient que les erreurs critiques.
C'est d'ailleurs ainsi que j'ai configuré log4cpp. Ainsi cela me permet d'être alerté par la présence d'info dans la log et d'étudier le problème en détail avec cout.std.
Le problème qui se pose à moi, c'est que le deuxième appel qui concerne le flux 'stderr' semble annuler le premier.
D'ailleurs comme le dis mon copain "man freopen" :
Alors voilà, je bute...FILE *freopen(const char *restrict filename, const char *restrict mode, FILE *restrict stream);
The freopen() function shall first attempt to flush the stream and close any file descriptor associated with stream.
Je me demandais si des fois un autre appel n'existe pas...
Merci de votre aide.
Partager