|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | |||||
|
Nouveau Membre du Club
![]() Rémy TassouxÉtudiant Inscription : décembre 2010 Messages : 32 ![]() |
Citation:
Par contre je crois qu'il y a méprise sur une partie du fonctionnement de mon logger. Je dis bien je crois, parce que je ne suis pas certain d'avoir parfaitement saisi toutes tes explications. Enfin de toute façon, s'il y a effectivement méprise, c'est de ma faute, j'aurais dû expliquer mon code. Mais je vais corriger cet écueil. Mon logger fonctionne par groupes (comme celui de Koala). Chacun de ces groupes, identifiés par une chaîne de caractère, peut être configuré indépendamment des autres. Par exemple : Code :
rwl::Logger::enable( false, L"RWL" ); // Je désactive tous les logs effectués dans le groupe RWL Les groupes et leur configuration sont gérés par la partie statique de mon logger. Il y a une deuxième partie qui est "dynamique", qui elle sert à logger proprement dit : Code :
Code :
rwl::Logger( L"RWL" ).log( rwl::Logger::Level::debug ) << L"Coucou, tu veux voir mon logger?" << std::endl; En résumé, je flush bel et bien mes données à chaque ligne, et donc si j'ai bien compris ce que ça signifiait, je n'écris pas en RAM. J'ai piqué l'idée de l'instance temporaire à ce monsieur : http://www.drdobbs.com/cpp/logging-in-c/201804215 Citation:
2) Ah oui, je suis bien d'accord. En fait je n'ai absolument pas pensé à cette problématique car je n'ai pas encore besoin d'utiliser plusieurs threads et qu'en plus de ça je ne sais pas vraiment m'en servir. Mais je devrais m'y mettre très prochainement, donc je vais être forcé de résoudre ce problème, je verrais à ce moment là. 3) Là par contre je n'ai pas compris ce que tu veux dire. Tu parles de mes groupes? J'avais considéré que c'était à la charge de l'utilisateur de spécifier correctement le groupe voulu, puisqu'au pire, si il se plante, ça loggera quand même, mais juste pas dans le bon groupe. Citation:
|
|||||
|
|
00
|
|
|
#22 | ||
![]() ![]() Germino LegrandDéveloppeur de jeux vidéo Inscription : octobre 2010 Messages : 369 ![]() |
Citation:
Citation:
D'ailleurs je n'ai jamais vu de cout corrompu sur la sortie standard en multithread...
__________________
|
||
|
10
|
|
|
#23 |
|
Expert Confirmé
![]() ![]() Joel LamotteDéveloppeur de jeux vidéo Inscription : août 2004 Messages : 1 554 ![]() |
Ils sont repris de Log4J (java) et la game de portages sur autres languages... Un classique en fait.
|
|
10
|
|
|
#24 |
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 675 ![]() |
Moi, si.
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
|
|
00
|
|
|
#25 | ||
|
Membre du Club
![]() Développeur .NET/C/C++ Inscription : septembre 2007 Messages : 53 ![]() |
Bonjour à tous,
concernant ton implémentation, il y a quand même un truc qui me chiffone grave : Le fait que l'écriture se fait dans ton destructcteur. Et ce pour 2 raisons: - Conceptuellement : un destructeur a pour role de libérer les ressources allouées par ta variable, pas d'effectuer le travail comme c'est le cas ici. - Plus concrètement : sauf erreur de ma part, si un exception est générée dans un destructeur, cela a pour conséquence l'appel à std::terminate et plante directement l'application sans aucune récupération possible. Autrement dit, si le moindre problème survient au moment de l'écriture du message dans le fichier, cela conduira au plantage pur et simple de ton appli. C'est pourquoi je trouve cette pratique TRES dangeureuse, limite à proscrire (et ce quoi qu'en dise/pense l'auteur de l'article que tu cites), ou alors il faut au minimum protéger cette partie du code avec un try/catch. Perso, je remplacerai cela par l'utilisation d'une classe logstream qui serai renvoyé par la méthode log. Cette classe surchargerai l'opérateur <<, serai responsable de construire la chaine de caractère à écrire, et ferai l'écriture dans le fichier proprement dite au moment ou elle reçoit le std::endl. En plus, cette méthode a pour avantage que tu peux réutiliser ta variable logger plutot que de la réinstancier à chaque fois. Typiquement : Code :
|
||
|
|
10
|
|
|
#26 | |||||
|
Expert Confirmé Sénior
![]() ![]() Emmanuel DelogetDéveloppeur informatique Inscription : septembre 2007 Messages : 1 826 ![]() |
Citation:
Code :
Code :
__________________
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...] Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi. Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça. Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas. Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas. |
|||||
|
20
|
|
|
#27 | ||
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 675 ![]() |
Citation:
Citation:
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
||
|
|
00
|
|
|
#28 |
|
Expert Confirmé Sénior
![]() |
@Emmanuel Deloget: Ton exemple est mauvais parce que tu as mis des interruptions au milieu des chaînes elles-mêmes, ce qui n'est pas possible avec des locks.
Ça ressemblerait plutôt à ceci: Code X :
sortie oh ! un peu à l'ouestla belle bleue !
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
00
|
|
|
#29 | ||||
|
Nouveau Membre du Club
![]() Rémy TassouxÉtudiant Inscription : décembre 2010 Messages : 32 ![]() |
Eh bah! Je ne me serais jamais douté que créer un logger, même primaire, était un tel casse tête.
J'ai donc à nouveau suivi vos conseils du mieux que je l'ai pu, et me revoici avec une nouvelle implémentation, proche de la précédente, mais sans utiliser de destructeur pour flusher, et en Singleton : Code :
Code :
|
||||
|
|
00
|
|
|
#30 | |
|
Membre du Club
![]() Développeur .NET/C/C++ Inscription : septembre 2007 Messages : 53 ![]() |
Citation:
Quoi qu'il en soit, merci pour la précision.
|
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com