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 :

Trop de log tue le log


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 52
    Points : 41
    Points
    41
    Par défaut Trop de log tue le log
    Bonjour à tous o/

    Je suis en train de développer un moteur de jeu et bien évidement, je me suis muni d'un log que je chéri beaucoup, voire trop !?
    En effet, je signale toutes les actions que fait mon moteur ( changement de scène, instanciation d'objet, chargement de ressource ). C'est bien utile, surtout si j'ai un bug. J'ai également mis en place un système de niveau d'alerte pour plus ou moins détaillés les actions et ainsi ne pas être trop "floodé" dans le log de sortie. Je peux également choisir l'entrée standard ou d'écrire dans un fichier ( peut être plus rapide ? ).

    Le faite est que dans le code, je me retrouve avec des;
    MonLog << "L’Objet truc est détruit !\n";
    un peu partout.

    Je me demande si cela n'est un coups en calcul supplémentaire et inutile, notamment pour une version Release.

    Alors je me demande si je dois pas plutôt effectuer un test comme;
    #ifdef _DEBUG
    MonLog << "L’Objet truc est détruit !\n";
    #endif
    Est-ce bonne méthode dans ce cas là ? Que feriez-vous ? Qu'en pensez vous ?

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Tu peux définir plusieurs niveaux de LOG, plus ou moins bavards, en fonction d'un paramètre d'entrée.

    En RELEASE à priori on n'a besoin que d'un LOG minimaliste, donc oui usage de _DEBUG là où le bavardage est intense.

    Aussi, éviter les iostream et utiliser directement l'API système (windows ?). Les iostream sont réputés pour leurs médiocres perfomances...

    Sous Windows, OutputDebugString() est sympa en conjonction avec dbgview.exe.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 52
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par camboui Voir le message
    Aussi, éviter les iostream et utiliser directement l'API système (windows ?). Les iostream sont réputés pour leurs médiocres perfomances...

    Sous Windows, OutputDebugString() est sympa en conjonction avec dbgview.exe.
    Oula j'ignorais cela, merci beaucoup

  4. #4
    Invité
    Invité(e)
    Par défaut
    a coup de macros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define LOG(s)\
    #ifdef _DEBUG
     MonLog(s)
    #endif
    au lieu d'appeler MonLog, tu appeles LOG

    edit:
    oops
    The resulting completely macro-replaced preprocessing token sequence is not processed as a preprocessing directive even if it resembles one.
    edit2:
    la symmetrique est ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef DEBUG
    #define LOG(s) MonLog(s)
    #else
    #define LOG(s)
    #endif
    Dernière modification par Invité ; 07/08/2012 à 14h30.

  5. #5
    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
    Citation Envoyé par galerien69 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef DEBUG
    #define LOG(s) MonLog(s)
    #else
    #define LOG(s)
    #endif
    Le problème de ce genre de macros est qu'il est difficile de les étendre correctement à plusieurs arguments.
    Je préfère pour cette situation utiliser l'astuce suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define LOG(lvl) if(lvl>LOG_LEVEL) ; else MonLog
     
    LOG(1) << "Ceci est un log" << endl;
    Détail : Je préfère ne pas utiliser directement NDEBUG pour activer/désactiver les logs, on peut vouloir les logs en release dans certains cas.
    Autre détail : Je préfère aussi avoir des logs activé sur un test dynamique, et non statique, et ne garder les logs activés statiquement que pour les cas où les performances sont réellement impactées. Ne pas avoir à recompiler pour modifier le niveau de log, voire même ne pas avoir à arrêter le logiciel, peut être précieux.
    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.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 52
    Points : 41
    Points
    41
    Par défaut
    merci pour toutes ces précieuses astuces

  7. #7
    Invité
    Invité(e)
    Par défaut
    Détail : Je préfère ne pas utiliser directement NDEBUG pour activer/désactiver les logs, on peut vouloir les logs en release dans certains cas.
    Rien ne t'empeche de definir une macro pour logger en RELEASE et une pour logger en DEBUG.

    Autre détail : Je préfère aussi avoir des logs activé sur un test dynamique, et non statique, et ne garder les logs activés statiquement que pour les cas où les performances sont réellement impactées. Ne pas avoir à recompiler pour modifier le niveau de log, voire même ne pas avoir à arrêter le logiciel, peut être précieux.
    oui ca peut se concevoir.

    Le problème de ce genre de macros est qu'il est difficile de les étendre correctement à plusieurs arguments.
    ouais, enfin j'emets quelques reserves sur l'argument, car il ne prend valeur que si le nombre d'arguments est variant LOG()(12,a==NULL) ce qui est un peu limite pour un log.

    Mais l'approche est interessante

    edit:
    comment modifierais-tu le niveau de log sans avoir a arreter le logiciel?

  8. #8
    Invité
    Invité(e)
    Par défaut
    En passant une variable au macro et non une constante ? (et en abaissant la valeur de la variable en dessous de LOG_LEVEL lorsqu'on veut logger)

  9. #9
    Invité
    Invité(e)
    Par défaut
    je présume que c'est log_level la variable. la question, c'est comment gérer la modification de cette variable de manière pas trop lourde et safe. Que se passe-t-il si subitement les logs affluent en trop grand nombre?

    etc...
    (j'ai pas de réponse, c'est par curiosité)

  10. #10
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Tiens, à propos, il n'existe pas une petite bibliothèque de log ?
    Il y a eu des discussions sur le sujet par le passé, sans rien de bien concret si j'ai bon souvenir.

  11. #11
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par camboui Voir le message
    Tiens, à propos, il n'existe pas une petite bibliothèque de log ?
    Il y a eu des discussions sur le sujet par le passé, sans rien de bien concret si j'ai bon souvenir.
    tu peux essayer log4cpp

    http://log4cpp.sourceforge.net/


    ou celui developpé par g****e
    http://code.google.com/p/google-glog/

    ou ...

    mais un logger simple avec des niveaux de trace n'est pas le truc le plus compliqué a faire.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  12. #12
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Je suis en train d'utiliser Boost.Log, c'est top mais pour les inexperimentés mieu vaut attendre que ça soit mis dans une release officielle de boost.

    Sinon conseils de log dans les jeux:

    1. Les macros comme décris ici,
    2. déléguer l'écriture du fichier de log à un logiciel externe: tu envoie les messages de log sur le réseau, ce qui fait que c'est plus ton appli qui perds du temps à gérer / trier les logs (evidement, dans le cas ou t'as besoin de perfs et de logs a la fois).
    3. sort quelque chose de triable et fait en sorte qu'il ya ait moyen de filtrer à la lecture. Par exemple avec du xml ou du JSon tu peux faire une petite page web qui trie automatiquement tout ce que tu veux de manière interractive.

    Enfin bref, les logs c'est tout un domaine, ondirait pas comme ça...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 52
    Points : 41
    Points
    41
    Par défaut
    et bien voilà, j'ai mixé toutes vos meilleurs idées et effectivement, en mode "release", je gagne maintenant quelques FPS sur mon appli test.

    Merci à tous

    (c'est toujours sympa de débattre et s'échanger des astuces, ça fait un peu comme un "Guru of the week" version developpez.net )

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 14/01/2009, 17h04
  2. Déplacer les log de /var/log vers /home/log
    Par Seb33300 dans le forum Administration système
    Réponses: 4
    Dernier message: 01/05/2008, 13h45
  3. [jdk logging] emplacement des logs sous linux
    Par nannous dans le forum Logging
    Réponses: 2
    Dernier message: 06/11/2007, 18h23
  4. Trop de vue tue la vue ?
    Par elitost dans le forum Oracle
    Réponses: 4
    Dernier message: 09/07/2007, 10h51
  5. trops de thread tue le thread ;)
    Par Dr Boba dans le forum POSIX
    Réponses: 2
    Dernier message: 21/11/2005, 16h43

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