web-dev-qa-db-fra.com

Quel est l'enregistreur C ++ thread-safe le plus efficace?

Je travaille sur une application multithread critique pour les performances. J'ai regardé la journalisation de rlog, Ace et Boost. J'ai choisi rlog car j'ai lu que c'était le plus rapide (lorsque la journalisation est désactivée, elle a le moins de surcharge).

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

85
cppalphadev

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

  1. La dernière version de la branche 0.9 est 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 non entretenu. La sortie de 0.11.xx est annoncée depuis 2 ans.

À mon avis, vous devriez aller avec boost.

33
kirsche40

Pantheios est considéré comme le meilleur exécutant la bibliothèque de journalisation C++ , tout en prétendant être le seul à être 100% sûr pour le type (voir cet article sur une bibliothèque connexe expliquant pourquoi les bibliothèques basées sur printf ()/iostream ne sont pas de type sécurisé)

19
dcw

J'ai réussi avec log4cxx sur 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 minimale (appel de méthode et comparaison d'entiers).

Le modèle de sortie vers le journal est défini par un modèle de conversion qui peut être aussi simple que la date/l'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.

10
user54700

Voici comment vous pouvez désactiver les informations supplémentaires fournies par rlog (telles que le nom de fichier, le numéro de ligne, etc.). Lorsque vous initialisez rlog dans votre fonction main() (ou n'importe où), 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 StdioNode est pour que les drapeaux contrôlent la sortie. Consultez la documentation de 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 ne colorie la sortie qu'en fonction de la gravité, sans aucune autre information ajoutée.

9
cassava

Vous voudrez peut-être envisager le système de journalisation. logog offre exactement ce type de fonctionnalité mais il n'a pas les dépendances implicites de code que Pantheios a. 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 passé en revue rlog, Pantheios et d'autres systèmes de journalisation avant d'implémenter celui-ci.

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

9
johnwbyrd

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.

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

4
Arkadiy

essayez la bibliothèque c-log, https://github.com/0xmalloc/c-log , une bibliothèque de journaux rapide, stable et thread-safe pour le langage C/C++.

2
user2538508

Poco a un bon support de journalisation ...

http://pocoproject.org/slides/110-Logging.pdf

2
Bhai

peut-être pantheios
même si je ne sais pas si c'est thread-safe ou non ...

2
mhd