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 :

Le logger en c++ [Débat]


Sujet :

C++

  1. #1
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut Le logger en c++
    [edit]: ceci est un fork d'une autre discussion.
    r0d.



    Pour un logger je serais tenter de dire Variable globale (comme std::cout).
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour à tous,

    Ce que j'appelle un "objet omniprésent" c'est une instance d'une classe dont on va avoir besoin quasiment partout dans le programme. Cela arrive assez fréquemment. Par exemple un logger, ou une classe de gestion de session sur les applis de type serveur, etc.

    Pour gérer cela, je vois deux solutions:
    1. Le singleton, bête et bourrin
    2. Le pointeur que l'on va se trimbaler partout

    Ca doit se sentir dans la forme de ma prose: aucune de ces 2 solutions ne me plaît. Mais je n'en vois pas d'autre. Auriez-vous d'autres idées à proposer?
    Pour une classe loggueur, le singleton me semble quand même la meilleure approche. (pourtant je suis pas un grand fan du singleton).
    Attention quand même au niveau de l'ordre de destruction du singleton, il en faut un plutôt bien pensé offrant plusieurs choix de gestion de durée de vie. (et là je dis, loki ftw).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,

    Pour des fonctions de log par exemple, le singleton peut être masqué par des fonctions libres plus simples : trace_message, trace_erreur, trace_debug... qui ont l'avantage de pouvoir être désactivée en release.

  4. #4
    screetch
    Invité(e)
    Par défaut
    c'est forcer de l'objet la ou il y en a pas non ?
    si tu n'as qu'une instance et que tout le monde y a acces je pense que ca releve plus de la programmation sequentielle que de la programmation objet.

    un logger, c'est jamais qu'un printf en gros. au lieu de te trimballer un singleton ou une instance, peut etre devrais tu publier des methodes statiques et qu'une classe (singleton) soit utilisée dans l'implémentation sans que ca se voie pour l'appelant

    je veux dire, si tout le monde fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Logger::instance()->log("blabla");
    je ne vois pas pourquoi ca serait plus moche de faire quitte a avoir un objet logger quelque part.

    [edit]comme 3Darchi. J'arrive souvent apres la bataille ces derniers temps...

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    [HS]
    Pour le logger, j'aime bien ajouter quelques macros, afin de pourvoir faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LOG_WARNING << "warning message" << param;
    LOG_ERROR << "warning message" << param;
    [/HS]
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    log("warning message" << param);
    avec log une macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define log(msg) Logger()<< msg;
    crée un logger temporaire, colle des trucs dedans. Libre au logger temporaire de faire ce qu'il lui chante . l'avantage c'est que tu peux complètement retirer le code en config optim.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Sauf qu'une telle macro n'est pas très "safe" (essaye de mettre une ',' dedans par exemple). La manière classique d'écrire une macro de log serait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define LOG if(logDisabled) ; else log
    LOG << "Test";
    Avec logDisabled une constante connue à la compilation, le code généré devrait être identique à rien du tout dans le cas où le log est inactif.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    screetch
    Invité(e)
    Par défaut
    je ne vois pas pourquoi c'est pas safe, qu'est ce qui se passe avec une virgule ?

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #define TOTO(x) cout << x;
    template<class A, class B>
    int f(A a, B b)
    {
    	return a*b;
    }
     
    int main()
    {
    	TOTO(f<int, int>(3,4) << endl);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1>main.cpp(26): warning C4002: too many actual parameters for macro 'TOTO'
    1>main.cpp(26): error C2143: syntax error : missing ',' before ';'
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut [débat] le logger en c++
    ce sujet semble intéresser. Alors pour éviter un overflow, j'ai fais un fork de la discussion d'à côté ici.

    A noter que loglite (qui me semble plutôt pas mal à permière vue) est actuellement candidate pour être intégrée à boost.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Je pense qu'il y a deux types de logs. Le log de debug que tu veux désactiver en production et le log en production dont tu as besoin parce qu'il y aura toujours un problème quelque part.

    Enfin personnellement, et même si en milieu industriel on ne peut pas se permettre de mettre un programme buggé en prod, il y a toujours quelque chose qui fait que l'on a besoin de logs.

    J'ai des projets où j'ai plusieurs façons de logger:

    - Des logs directement dans le buffer du kernel pour des machines embarqué sous linux
    - Des logs fichiers journaliers
    - Des logs envoyés à un serveur distant pour être mis en base de donnée et accessible sur les outils de monitoring globaux, avec traduction etc..

    Sinon pour en revenir au sujet j'ai pas mal utilisé log4cpp en singleton, avec extensions des classes existantes

Discussions similaires

  1. La commande logger
    Par Bicnic dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 29/10/2013, 10h09
  2. [TOMCAT][LOGGER]Pb pour voir les logs HTTP ?
    Par elitost dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 28/07/2005, 16h15
  3. [Perf]Utilisation des Logger et temps de traitement ?
    Par elitost dans le forum Logging
    Réponses: 6
    Dernier message: 12/04/2005, 23h13
  4. [log4j] Exception à la récupération de Logger
    Par Twofy dans le forum Logging
    Réponses: 5
    Dernier message: 19/07/2004, 15h49
  5. [interbase]Se logger après une première installation
    Par Ultra-FX dans le forum InterBase
    Réponses: 3
    Dernier message: 13/09/2002, 11h44

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