Quel est le logger C ++ thread-safe le plus efficace? [fermé]


85

Je travaille sur une application multithread à performances critiques. J'ai regardé la journalisation rlog, Ace et Boost. J'ai choisi rlog parce que j'ai lu que c'était le plus rapide (lorsque la journalisation est désactivée, il a le moins de frais généraux).

Le problème que j'ai est qu'il montre le nom du fichier, le numéro de ligne, etc. même en mode de libération. Si vous pouvez me dire comment désactiver ces informations, mon problème pourrait être résolu. Dans tous les cas, quel est le logger le plus efficace en C ++ pour ma situation?


23
J'arrive rapidement à la conclusion que le boost a tout. Même si ce n'est pas le cas, il sera apparu lorsque vous regarderez à nouveau!
Martin Beckett

20
Je ne vois pas pourquoi c'est fermé. Il a posé une question précise et mesurable. Si nous négligeons le compilateur utilisé, il ne peut y avoir qu'un seul «enregistreur C ++ thread-safe le plus efficace». Stackoverflow ces jours-ci ....
JohnJohn


Réponses:


35

Malheureusement, je ne peux pas voter pour le moment. Pour autant que je puisse dire, n'utilisez jamais de merde comme Apache log4cxx. Il contient de sérieux bugs.

  1. La dernière version de la branche 0.9 est la 0.9.7 et contient toujours des fuites de mémoire car chaque classe avec des membres virtuels n'a pas de dtor virtuel.
  2. La dernière version 0.10.x a perdu beaucoup de fonctionnalités de 0.9.x et n'est pas rétrocompatible. Vous êtes obligé de réécrire une grande partie de votre propre code.
  3. L'ensemble du projet semble ne pas être maintenu. La sortie de 0.11.xx est annoncée depuis 2 ans.

À mon avis, vous devriez aller avec boost.


10
"chaque classe avec des membres virtuels n'a pas de décor virtuel" ne le croyait pas et a dû le vérifier. Apache assez décevant.
ManuelSchneid3r

6
Vous pouvez voter contre maintenant :)
Fund Monica's Lawsuit

5
>> "chaque classe avec des membres virtuels n'a pas de décor virtuel" Bien que ce ne soit pas merveilleux, cela ne signifie pas que cela pose un problème. Ce n'est un problème que si les classes sont supprimées par leur type dynamique plutôt que par leur type statique. Cela, à lui seul, n'est pas un problème en soi et ne signifie pas qu'une mémoire est divulguée.
evilrix

1
@evilrix Les classes ont des membres virtuels mais pas de décor virtuel. Les classes n'ont pas de nouveaux opérateurs protégés / privés. En fait, c'est un code très pauvre et mauvais qui n'aurait jamais dû être publié. Alors, quel est votre point?
kirsche40

@ kirsche40 Je pensais que mon argument était assez clair. Quelle partie de mon explication sur la formulation de la norme n'avez-vous pas comprise? Permettez-moi de reformuler: c'est un problème si vous essayez de supprimer via un pointeur de classe de base. Dans ce cas, si le destructeur n'est pas virtuel, le comportement n'est pas défini. La norme est exceptionnellement claire sur ce point. Je suis à peu près sûr que rien de ce que j'ai dit n'implique que je préconise que l'OP l'utilise comme implémentation.
evilrix

19

On pense que Pantheios est la bibliothèque de journalisation C ++ la plus performante , et prétend être la seule à 100% de sécurité de type (voir cet article sur une bibliothèque associée expliquant pourquoi les bibliothèques basées sur printf () / iostream ne sont pas de type- sûr)


4
Et même s'ils n'aiment pas Pantheios, la liste des «concurrents» sur la page que vous avez liée est informative.
jwd

10

J'ai eu du succès avec log4cxx à http://logging.apache.org/log4cxx/index.html . Il s'agit d'une version C ++ du célèbre enregistreur Log4j, facile à configurer via un fichier conf ou dans le code. La surcharge lorsqu'elle est désactivée est minime (appel de méthode et comparaison d'entiers).

Le modèle de sortie dans le journal est défini par un modèle de conversion qui peut être aussi simple que la date / heure et un message. Il gère également la limitation de la taille des fichiers, le survol, etc. Vous pouvez également configurer différents modèles pour diverses erreurs et sources.


9

Voici comment vous pouvez désactiver les informations supplémentaires fournies par rlog (comme le nom de fichier, le numéro de ligne, etc.). Lorsque vous initialisez rlog dans votre main()fonction (ou ailleurs), vous pouvez effectuer les opérations suivantes:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

Le deuxième argument de StdioNodeest que les indicateurs contrôlent la sortie. Consultez la documentation rlog (peut être générée avec Doxygen) pour la liste complète des drapeaux possibles. Celui de l'exemple ici fait que rlog colorie uniquement la sortie en fonction de la gravité, sans aucune autre information ajoutée.


9

Vous voudrez peut-être envisager le système de logog. logog offre exactement ce type de fonctionnalité mais il n'a pas les dépendances implicites de code dont dispose Pantheios. logog est thread-safe et permet un haut degré de contrôle sur les types de messages enregistrés à tout moment.

Je suis l'auteur et le mainteneur de logog, donc mon opinion est un peu biaisée. Mais j'ai examiné rlog, Pantheios et d'autres systèmes de journalisation avant de mettre en œuvre celui-ci.

https://github.com/johnwbyrd/logog .


Lien mis à jour, merci pour la note.
johnwbyrd

4

Une partie de la surcharge peut se produire dans vos macros / flux. Vous devez faire très attention à ne pas composer la chaîne en cours de journalisation lorsque la journalisation est désactivée.

L'utilisation intelligente des flux et de l'opérateur?: Vous permet de le faire, tout comme les macros.




2

essayez la bibliothèque c-log, https://github.com/0xmalloc/c-log , une bibliothèque log rapide, stable et sûre pour les threads pour le langage C / C ++.


8
Malheureusement, c-log est sous GPL, ce qui signifie que vous ne pouvez pas l'utiliser avec un logiciel non compatible avec la GPL (par exemple commercial propriétaire). Cela le rend inutilisable pour de nombreux utilisateurs.
chris

maintenant il n'y a pas de LICENCE dans github.com/0xmalloc/c-log C'est gratuit pour un usage commercial et personnel.
user2538508

2
Êtes-vous l'auteur de c-log? Si tel est le cas, je vous suggère fortement d'indiquer explicitement (sur la page Github, le fichier readme et les commentaires dans le code source) sous quelle licence votre logiciel est publié. Même si cela est censé être du domaine public (ce que je ne recommande pas!), Vous devez le déclarer explicitement. Cela étant dit, il existe de nombreuses licences open source "commerciales" (c'est-à-dire permissives) parmi lesquelles choisir - les plus populaires sont Apache, BSD ou MIT.
chris

Linux uniquement? ( #include <pthread.h>...)
rustyx
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.