Voulant faire un système de log qui ressemble à std::cout, désactivable
au run-time et peu coûteux quand désactivé, un collègue et moi n'avons
rien vu d'autre qu'une macro. S'en suivent deux questions :
1/ Quelqu'un a-t-il une idée sans macro qui évite de demander à
l'utilisateur de faire des tests à la main à chaque sortie ?
2/ Je n'ai pas vraiment l'habitude de faire des macros. Pour l'instant,
je pense à faire un truc du genre :
#define LOG if (!log.isActive()) ; else log
Qui s'utiliserait ainsi :
LOG << "Hello world!" << endl;
Quelqu'un voit-il des limitations à cette approche ?
A priori, il y a un risque de perte de performances lors de l'évaluation de t et des différents appels à l'opérateur<<, mais c'est effectivement significativement mieux que si on mettait en forme t pour jeter le résultat ensuite.
Et si le compilateur optimise bien, il pourrait n'évaluer t que lorsque son résultat est désiré, voire inliner les appels à operator<< (Log &, T) et ne faire qu'un seul test isActive, même si je doute que ce soit à la portée des compilateurs actuels.
Je vais faire quelques benchs pour voir ce que ça donne en vrai.
-- Loïc
Fabien LE LEZ wrote:
On Fri, 16 Jul 2004 23:35:52 +0200, Loïc Joly
<loic.actarus.joly@wanadoo.fr>:
Voulant faire un système de log qui ressemble à std::cout, désactivable
au run-time et peu coûteux quand désactivé
A première vue, et sans trop réfléchir aux tenants et aboutissants, je
vois ceci :
A priori, il y a un risque de perte de performances lors de l'évaluation
de t et des différents appels à l'opérateur<<, mais c'est effectivement
significativement mieux que si on mettait en forme t pour jeter le
résultat ensuite.
Et si le compilateur optimise bien, il pourrait n'évaluer t que lorsque
son résultat est désiré, voire inliner les appels à operator<< (Log &,
T) et ne faire qu'un seul test isActive, même si je doute que ce soit à
la portée des compilateurs actuels.
Je vais faire quelques benchs pour voir ce que ça donne en vrai.
A priori, il y a un risque de perte de performances lors de l'évaluation de t et des différents appels à l'opérateur<<, mais c'est effectivement significativement mieux que si on mettait en forme t pour jeter le résultat ensuite.
Et si le compilateur optimise bien, il pourrait n'évaluer t que lorsque son résultat est désiré, voire inliner les appels à operator<< (Log &, T) et ne faire qu'un seul test isActive, même si je doute que ce soit à la portée des compilateurs actuels.
Je vais faire quelques benchs pour voir ce que ça donne en vrai.
-- Loïc
Fabien LE LEZ
On Sat, 17 Jul 2004 01:39:13 +0200, Loïc Joly :
inliner les appels à operator<< (Log &, T)
Suivant les compilos, il est possible que rajouter "inline" ait une influence...
On Sat, 17 Jul 2004 01:39:13 +0200, Loïc Joly
<loic.actarus.joly@wanadoo.fr>:
inliner les appels à operator<< (Log &,
T)
Suivant les compilos, il est possible que rajouter "inline" ait une
influence...
Suivant les compilos, il est possible que rajouter "inline" ait une influence...
Patrick Mézard
Loïc Joly wrote:
Bonjour,
Voulant faire un système de log qui ressemble à std::cout, désactivable au run-time et peu coûteux quand désactivé, un collègue et moi n'avons rien vu d'autre qu'une macro. S'en suivent deux questions :
1/ Quelqu'un a-t-il une idée sans macro qui évite de demander à l'utilisateur de faire des tests à la main à chaque sortie ?
2/ Je n'ai pas vraiment l'habitude de faire des macros. Pour l'instant, je pense à faire un truc du genre :
#define LOG if (!log.isActive()) ; else log
Qui s'utiliserait ainsi :
LOG << "Hello world!" << endl;
Quelqu'un voit-il des limitations à cette approche ?
Ca ne va pas répondre à ta question, mais peut-être que tu trouveras des idées intéressantes ici : http://log4cpp.sourceforge.net/
Je sais qu'il y a eu quelques discussions à ce sujet sur la ML de dev de boost. Tu peux chercher des posts de John Torjo, il a posé une version de sa bibliothèque dans le bac à sable de boost récemment il me semble. Mais je ne sais absolument pas ce que ça vaut.
Patrick Mézard
Loïc Joly wrote:
Bonjour,
Voulant faire un système de log qui ressemble à std::cout, désactivable
au run-time et peu coûteux quand désactivé, un collègue et moi n'avons
rien vu d'autre qu'une macro. S'en suivent deux questions :
1/ Quelqu'un a-t-il une idée sans macro qui évite de demander à
l'utilisateur de faire des tests à la main à chaque sortie ?
2/ Je n'ai pas vraiment l'habitude de faire des macros. Pour l'instant,
je pense à faire un truc du genre :
#define LOG if (!log.isActive()) ; else log
Qui s'utiliserait ainsi :
LOG << "Hello world!" << endl;
Quelqu'un voit-il des limitations à cette approche ?
Ca ne va pas répondre à ta question, mais peut-être que tu trouveras des
idées intéressantes ici :
http://log4cpp.sourceforge.net/
Je sais qu'il y a eu quelques discussions à ce sujet sur la ML de dev de
boost. Tu peux chercher des posts de John Torjo, il a posé une version
de sa bibliothèque dans le bac à sable de boost récemment il me semble.
Mais je ne sais absolument pas ce que ça vaut.
Voulant faire un système de log qui ressemble à std::cout, désactivable au run-time et peu coûteux quand désactivé, un collègue et moi n'avons rien vu d'autre qu'une macro. S'en suivent deux questions :
1/ Quelqu'un a-t-il une idée sans macro qui évite de demander à l'utilisateur de faire des tests à la main à chaque sortie ?
2/ Je n'ai pas vraiment l'habitude de faire des macros. Pour l'instant, je pense à faire un truc du genre :
#define LOG if (!log.isActive()) ; else log
Qui s'utiliserait ainsi :
LOG << "Hello world!" << endl;
Quelqu'un voit-il des limitations à cette approche ?
Ca ne va pas répondre à ta question, mais peut-être que tu trouveras des idées intéressantes ici : http://log4cpp.sourceforge.net/
Je sais qu'il y a eu quelques discussions à ce sujet sur la ML de dev de boost. Tu peux chercher des posts de John Torjo, il a posé une version de sa bibliothèque dans le bac à sable de boost récemment il me semble. Mais je ne sais absolument pas ce que ça vaut.
Patrick Mézard
Fabien LE LEZ
On Sat, 17 Jul 2004 10:49:34 +0200, Loïc Joly :
Je vous déteste tous, à faire des bibliothèques réutilisables ou à savoir qu'elles existent ;)
Règle 1 : quoi qu'on cherche à faire, le code pour le faire existe déjà. Règle 2 : dans la majorité des cas, le code est tellement mal écrit que refaire tout soi-même est plus facile et plus rapide que d'essayer d'utiliser le code déjà fait.
On Sat, 17 Jul 2004 10:49:34 +0200, Loïc Joly
<loic.actarus.joly@wanadoo.fr>:
Je vous déteste tous, à faire des bibliothèques réutilisables ou à
savoir qu'elles existent ;)
Règle 1 : quoi qu'on cherche à faire, le code pour le faire existe
déjà.
Règle 2 : dans la majorité des cas, le code est tellement mal écrit
que refaire tout soi-même est plus facile et plus rapide que d'essayer
d'utiliser le code déjà fait.
Je vous déteste tous, à faire des bibliothèques réutilisables ou à savoir qu'elles existent ;)
Règle 1 : quoi qu'on cherche à faire, le code pour le faire existe déjà. Règle 2 : dans la majorité des cas, le code est tellement mal écrit que refaire tout soi-même est plus facile et plus rapide que d'essayer d'utiliser le code déjà fait.
Loïc Joly
Patrick Mézard wrote:
Ca ne va pas répondre à ta question, mais peut-être que tu trouveras des idées intéressantes ici : http://log4cpp.sourceforge.net/
J'ai regardé, et j'ai trouvé ça gros et pas du tout docummenté (j'aime bien doxygen, mais les gens qui pensent qu'il suffit de passer doxygen sur du code pour avoir de la doc, bin j'aime pas...).
Je sais qu'il y a eu quelques discussions à ce sujet sur la ML de dev de boost. Tu peux chercher des posts de John Torjo, il a posé une version de sa bibliothèque dans le bac à sable de boost récemment il me semble. Mais je ne sais absolument pas ce que ça vaut.
Par contre, ça m'a l'air pas mal. Je vais y jeter un oeil plus poussé quand je serai au boulot, mais cette bibliothèque a l'air de m'enlever tout le fun que j'aurais eu à écrire ma fonction de log moi même.
Je vous déteste tous, à faire des bibliothèques réutilisables ou à savoir qu'elles existent ;)
Pour info, ceux que ça intéresse, il utilise une macro semblable à ce que j'avais proposé pour désactiver le log.
-- Loïc
Patrick Mézard wrote:
Ca ne va pas répondre à ta question, mais peut-être que tu trouveras des
idées intéressantes ici :
http://log4cpp.sourceforge.net/
J'ai regardé, et j'ai trouvé ça gros et pas du tout docummenté (j'aime
bien doxygen, mais les gens qui pensent qu'il suffit de passer doxygen
sur du code pour avoir de la doc, bin j'aime pas...).
Je sais qu'il y a eu quelques discussions à ce sujet sur la ML de dev de
boost. Tu peux chercher des posts de John Torjo, il a posé une version
de sa bibliothèque dans le bac à sable de boost récemment il me semble.
Mais je ne sais absolument pas ce que ça vaut.
Par contre, ça m'a l'air pas mal. Je vais y jeter un oeil plus poussé
quand je serai au boulot, mais cette bibliothèque a l'air de m'enlever
tout le fun que j'aurais eu à écrire ma fonction de log moi même.
Je vous déteste tous, à faire des bibliothèques réutilisables ou à
savoir qu'elles existent ;)
Pour info, ceux que ça intéresse, il utilise une macro semblable à ce
que j'avais proposé pour désactiver le log.
Ca ne va pas répondre à ta question, mais peut-être que tu trouveras des idées intéressantes ici : http://log4cpp.sourceforge.net/
J'ai regardé, et j'ai trouvé ça gros et pas du tout docummenté (j'aime bien doxygen, mais les gens qui pensent qu'il suffit de passer doxygen sur du code pour avoir de la doc, bin j'aime pas...).
Je sais qu'il y a eu quelques discussions à ce sujet sur la ML de dev de boost. Tu peux chercher des posts de John Torjo, il a posé une version de sa bibliothèque dans le bac à sable de boost récemment il me semble. Mais je ne sais absolument pas ce que ça vaut.
Par contre, ça m'a l'air pas mal. Je vais y jeter un oeil plus poussé quand je serai au boulot, mais cette bibliothèque a l'air de m'enlever tout le fun que j'aurais eu à écrire ma fonction de log moi même.
Je vous déteste tous, à faire des bibliothèques réutilisables ou à savoir qu'elles existent ;)
Pour info, ceux que ça intéresse, il utilise une macro semblable à ce que j'avais proposé pour désactiver le log.
-- Loïc
Christophe de VIENNE
Loïc Joly wrote:
Patrick Mézard wrote:
Ca ne va pas répondre à ta question, mais peut-être que tu trouveras des idées intéressantes ici : http://log4cpp.sourceforge.net/
J'ai regardé, et j'ai trouvé ça gros et pas du tout docummenté (j'aime bien doxygen, mais les gens qui pensent qu'il suffit de passer doxygen sur du code pour avoir de la doc, bin j'aime pas...).
Regarde log4cxx, c'est quasi la même chose (c'est le portage de log4j pour c++), mais fait par d'autres personnes. La documentation y est très correcte à mon gout. http://logging.apache.org/log4cxx/
A+
Christophe
-- Christophe de Vienne
Loïc Joly wrote:
Patrick Mézard wrote:
Ca ne va pas répondre à ta question, mais peut-être que tu trouveras
des idées intéressantes ici :
http://log4cpp.sourceforge.net/
J'ai regardé, et j'ai trouvé ça gros et pas du tout docummenté (j'aime
bien doxygen, mais les gens qui pensent qu'il suffit de passer doxygen
sur du code pour avoir de la doc, bin j'aime pas...).
Regarde log4cxx, c'est quasi la même chose (c'est le portage de log4j
pour c++), mais fait par d'autres personnes. La documentation y est très
correcte à mon gout.
http://logging.apache.org/log4cxx/
Ca ne va pas répondre à ta question, mais peut-être que tu trouveras des idées intéressantes ici : http://log4cpp.sourceforge.net/
J'ai regardé, et j'ai trouvé ça gros et pas du tout docummenté (j'aime bien doxygen, mais les gens qui pensent qu'il suffit de passer doxygen sur du code pour avoir de la doc, bin j'aime pas...).
Regarde log4cxx, c'est quasi la même chose (c'est le portage de log4j pour c++), mais fait par d'autres personnes. La documentation y est très correcte à mon gout. http://logging.apache.org/log4cxx/