J'écris une bibliothèque partagée C ++ destinée à être utilisée par une autre bibliothèque ou exécutable. Quelle est la meilleure façon d'ajouter une journalisation générique dans ma bibliothèque? Idéalement, j'aimerais adapter ma bibliothèque à la journalisation des fonctionnalités choisies par l'utilisateur de la bibliothèque.
Supposons que j'ai une classe dans ma bibliothèque Je ne veux pas rendre ma bibliothèque liée à une API spécifique log4xxx. p> p>
6 Réponses :
syslog - vous pouvez alors avoir quelle installation syslog l'utilise. p>
ou permettre à l'utilisateur de spécifier un rappel. P>
Si vous ne voulez pas utiliser une liberge de journalisation existante, vous pouvez essayer d'utiliser des macros. Je recommanderais de fournir votre propre lib et de la rendre disponible avec des macros avec Printf, comme le mécanisme de formatage.
J'ai fait quelque chose comme ça dans le passé. La macro appelée objet journal qui encapsule la journalisation réelle qui était possible pour étendre via le plugin. P>
mais je pense que quelque chose de similaire est déjà fait par log4xxx alors peut-être qu'il est peut-être bon de le regarder. P>
Voici une proposition (désolé de tester, j'espère que cela fonctionne) P>
Rubrique: P>
LOG_INF("Hello %s!", "world");
VOID JOURNAL :: Opérateur () (Const Char * Format, ...); Dans cette fonction, comment pouvez-vous garantir la longueur du message ne peut être grasse que la "longueur"?
Je pense que vous avez raison et vous devriez prendre soin de ce point dans vous, utilisez une telle solution.
Vous pouvez utiliser Google-Glog. Je trouve bien d'utiliser. P>
https://github.com/google/glog p>
Il prend en charge les valeurs de débogage par fichier, peut vous connecter à Syslog, vous envoyer un e-mail et des charges d'autres fonctionnalités agréables. P>
Déclarez le prototype de la fonction de journalisation dans votre bibliothèque:
class A { public: void method(string param1, int param2); } void A::method(string param1, int param2){ string formatted = str( boost::format( "param1=%s param2=%d" ) % param1 % param2 ); UserLog( formatted.c_str() ); }
Vous pouvez fournir un mécanisme de rappel pour permettre à l'utilisateur de la bibliothèque de fournir à votre bibliothèque un adaptateur dans leur journalisation.
IE, dans votre bibliothèque, fournissez une classe d'interface de journalisation abstraite, par exemple: P>
Log::log ("My log message");
Merci, belle solution! Je peux également fournir une journalisation par défaut (E.G. syslog) si aucun enregistreur utilisateur n'a été enregistré dans ma lib.