11
votes

Ajout de la prise en charge de la journalisation générique dans la bibliothèque partagée C ++

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 xxx

Je ne veux pas rendre ma bibliothèque liée à une API spécifique log4xxx.


0 commentaires

6 Réponses :


1
votes

0 commentaires

-1
votes

syslog - vous pouvez alors avoir quelle installation syslog l'utilise.

ou permettre à l'utilisateur de spécifier un rappel.


0 commentaires

0
votes

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");


2 commentaires

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.



0
votes

Vous pouvez utiliser Google-Glog. Je trouve bien d'utiliser.

https://github.com/google/glog

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.


0 commentaires

2
votes

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() );
}


0 commentaires

14
votes

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");


1 commentaires

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.