bonjour,
quelque un connait un bonne librairie pour faire des log ?
j ai bien vue log4cxx mais c ets limitter a linux.
Poco semble pas mal, a vez vous des avis, ou en connaisé vous d autres ??
merci.
Version imprimable
bonjour,
quelque un connait un bonne librairie pour faire des log ?
j ai bien vue log4cxx mais c ets limitter a linux.
Poco semble pas mal, a vez vous des avis, ou en connaisé vous d autres ??
merci.
Boost va avoir la sienne d'ici peu. :)
WinLog alors mais c'est Windows (comme son nom le laisse supposer)
Salut,
Non c'est multi-plate-forme, cf. par ex les instructions pour compiler avec MSVC.
MAT.
Qu'attends tu d'une librairie qui gère les logs ?
Ca c est une excellente question.Citation:
Qu'attends tu d'une librairie qui gère les logs ?
En fait je regarde dans un premier temps quelque chose de portable linux windows.
Et ensuite j evalue ce que cette librairie fait.
Actuellement on développent plusieurs projet, et je me suis rendu compte que l'on avait un besoin criant d'uniformisation concernant les log de sortie.
Actuellement le minimum qui devrai etre gere, serai que le log puissent reprendre plusieurs niveau, debug, test, release, nolog, ect...
que ces log soit gere par stream pour faciliter leur manipulation vers des fichier ou dans les gui ou vers une console.
Pour le reste je ne sais pas trop, mais je suis persuader que les lib integre plussieur fonction que je ne connait pas et qui serait pratique.
Alors regarde WinLog. Il y a les sources et des choses qui ressemblent à ce que tu demandes.
J'aimerais bien voir un portage sous Linux
Bé dans ce cas moi j'ai fait un composite.
C'est à dire une classe de base, ILogger qui définie une méthode virtuelle pure "Log(const char* message)" avec les redifinitions concrètes des différentes variantes : Log(CString&), Log(std::string&) etc. ainsi que l'opérateur "<<" pour le gérer comme un flux, mais tous appellent finalement la version "const char*", déléguée aux classes concrètes qui ne feront que redéfinir une seule méthode la version basique, "const char*"
Pour chaque nouveau logger, tu as juste à hériter de ILogger et redéfinir la méthode "Log(const char* message)". Ainsi, CFileLogger ouvrira un fichier à la construction et écrira dedans dans sa méthode Log(const char*), CDebugLogger lui fera du OutputDebugLogger, CSoketLogger lui écrira dans un socket, CConsoleLogger ecrira dans la console...
Puis un CLogManager qui sera finalement un "ILogger", mais dont le rôle est d'encapsuler différent ILogger et de leur transmettre le message à chacun, j'en ai donc fait un singleton.
Puis tes classes concrètesCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class ILogger { public: void Log(CString& sMessage) { *this << sMessage.GetBuffer(); } void Log(std::string& sMessage) { *this << sMessage.c_str(); } template <class T> ILogger& ILogger::operator <<(const T& rtToLog) { std::ostringstream Stream; Stream << rtToLog; Log(Stream.str()); return *this; } protected: virtual void Log(const char* sMessage) = 0; };
Pareil avec tout type de logger (vers le debug, vers un socket, vers une fenêtre etc...)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 class CFileLogger : public ILogger { public: CFileLogger(const char* sFile) { // Initialisation du fichier, m_File.open etc... } ~CFileLogger() { m_File.close(); } protected: virtual void Log(const char* sMessage) { m_File << sMessage; } private: std::ofstream m_File }
Et le gestionnaire :
Je te passe l'utilité d'un singleton. Puis tu fais un typedef pour plus d'aisance :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 class CLogManager : public CSingleton<CLogManager>, public ILogger { public : // Destructeur qui détruit les loggers void AddLogger(ILogger* logger); void RemoveLogger(ILogger* logger); protected: virtual void Log(const char* sMessage) { std::vector<ILogger*>::iterator it = m_vecLoggers.begin(); while(it != m_vecLoggers.end()) { *it << sMessage; // pour transmettres aux loggers enregistrés } } private: std::vector<ILogger*> m_vecLoggers; };
Pour ensuite te retrouver avecCode:
1
2 typedef CLogManager::Instance() Log
à l'initialisation, puisCode:
1
2
3
4 Log.AddLogger(new CFileLogger("output.log")); Log.AddLogger(new CDebugLogger()); Log.AddLogger(new CSocketLogger("192.168.1.2", "3131"));
à l'utilisationCode:
1
2
3
4 int i = 2; float f = 5.0f; Log << "Message" << i << " de " << f << std::endl;
Je trouve qu'une bonne lib de log doit aussi gérer le temps, avec des compteurs, estimation de temps restant de tâche, etc.
Ouais moi j'ai rajouté des fonction d'obtention de temps dans le manager, qui va construire une chaîne de caractère représentant la date et l'heure, puis la transmettre à chaque "logger" enregistré.
Après des compteurs, du temps etc... ça doit être dossicié des logs. Admettons un chargement avec une barre de progression, devoir utiliser la lib des logs pour obtenir l'avancement et l'estimation du temps restant ressemblerai à un problème de conception.
Non, c'est une question de définition. On a souvent besoin de gérer le log et le temps ensemble. Ce n'est pas pour ça qu'il faut les conceptualiser dans une même classe, mais dans une même lib ça ne me dérangerait pas.
Enocre un besoin pour un librairie de log:
http://www.developpez.net/forums/d69...on-loperateur/