OVH Cloud OVH Cloud

Système de log

7 réponses
Avatar
Loïc Joly
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 ?

--
Loïc

7 réponses

Avatar
Fabien LE LEZ
On Fri, 16 Jul 2004 23:35:52 +0200, Loïc Joly
:

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 :

struct Log
{
bool isActive() const;
ostream& GetOstream();
//...
};

template <class T> Log& operator << (Log& l, T const& t)
{
if (l.isActive())
{
l.GetOstream() << t;
}
return l;
}

Avatar
Loïc Joly
Fabien LE LEZ wrote:

On Fri, 16 Jul 2004 23:35:52 +0200, Loïc Joly
:


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 :

struct Log
{
bool isActive() const;
ostream& GetOstream();
//...
};

template <class T> Log& operator << (Log& l, T const& t)
{
if (l.isActive())
{
l.GetOstream() << t;
}
return l;
}


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


Avatar
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...

Avatar
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

Avatar
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.

Avatar
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

Avatar
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