Documentation:Doc Outils Log User
From Gameforge Official Website
|
Objectif GFLOG est un outil qui permet aux programmeurs de générer un ensemble de rapport de log pour leurs code en C++. Il est important de pouvoir localiser une erreur ou un dysfonctionnement dans le code d'une application. Avec l'outil GFLOG, vous pouvez activer ou modifier les logs sans avoir à recompiler l'ensemble de l'application. GFLOG a été créé dans le but précis de simplifier le developpement et le débogage des applications du projet. |
|
Présentation Ce document a pour but de décrire l'architecture de l'outil GFLog. Il est composé de 3 éléments principaux : les loggers, les filtres et les flux de sortie.
Ces trois composant regroupés permettent d'afficher les rapports de log suivant le type, le niveau et le formatage choisi.
Les loggers sont des noeuds constitués et nommés de façon hiérarchique. Les parents sont séparés des enfants par un point ("."). Par exemple gameforge.common est le parent de gameforge.common.log. Identique pour gameforge qui est parent de gameforge.client et un ancêtre de gameforge.client.engine Ceci est une façon de nommer une hierarchisation des loggers. Un père reçoit également les messages de ses enfants. Pour les loggers suivant : gameforge.client et gameforge.serveur. Les loggers gameforge.client et gameforge.serveur recevront leurs messages respectifs tandis que le logger gameforge recevra les messages de gameforge.client et de gameforge.serveur en plus de ses propres messages. Le logger Root reside au plus haut niveau de la hiérarchie. Il a deux spécificités :
La création de ce logger s'effectue en appellant la foncton gameforge::commun::log::Logger::getRootLogger() et les autres noeuds par gameforge::commun::log::Logger::getLogger("gameforge.test")
Les filtres définissent le niveau ainsi l'activation ou la désactivation des logs. Des niveaux peuvent être assignés aux loggers. Les niveaux sont des types enum défini dans la classe Logger.hh sous le nom de TraceLevel'. Les niveaux suivants sont définis par ordre de priorité croissante :
GFLOG vous permet actuellement d'envoyer le message vers trois destinations à la fois. Un logger peut donc avoir plusieurs destinations de sortie.
Il ya actuellement deux types de formatage :
%yyyy => ANNEE %mo => MOIS %dd => JOUR %hh => HEURE %mi => MINUTE %ss => SECONDE %ff => MILLIEME DE SECONDE %unique => NUMERO UNIQUE %file => NOM DU FICHIER %line => NUMERO DE LIGNE %type => TYPE DE MESSAGE %t => NUMERO DU THREAD %message => MESSAGE |
|
Mise en place L'utilisation de GFLOG est configurable de façon manuelle. Par contre, il peut s'avérer pratique de le configurer en utilisant des fichiers de configuration. Actuellement, le fichier de configuration est écrit en XML. GFLOG possède deux configurateurs distincts :
Exemple de code d'initialisation des loggers #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <string> #include <iostream> #include "gameforge/commun/log/Logger.hh" using namespace std; using namespace gameforge::commun::log; int main(void) { try { LoggerPtr root = Logger::getRootLogger(); LoggerPtr logger = Logger::getLogger("gameforge.test"); GFINFO(logger, "Entering in code"); return 0; } catch(...) { return 1; } }
L'avantage d'utiliser ce mode de configuration est que les modifications sont effectuées de manière dynamique. Fichier XML <?xml version="1.0" encoding="ISO-8859-1"?> <log> <!-- Definition des flux de sortie --> <output id="f" type="file"> <propertie name="Blablabla-%yyyy%mo%dd-%hh%mi%ss-%unique"/> <propertie format="%file (%line) : %type %hh:%mi:%ss:%ff [%t] - %message"/> <propertie maxsize="200k" /> </output> <output id="c" type="stdout"> <propertie format="%file (%line) : %type %hh:%mi:%ss:%ff [%t] - %message"/> </output> <output id="e" type="stderr"> <propertie format="%file (%line) : %type %hh:%mi:%ss:%ff [%t] - %message"/> </output> <!-- Definition des règle de filtrage --> <node name="."> <filter level="debug" output="e" /> <filter level="error" output="c" /> </node> <node name="gameforge.client"> <filter level="debug" output="c" /> </node> <node name="gameforge.server"> <filter level="error" output="f" /> </node> <node name="gameforge.commun.msg"> <filter status="false" /> </node> </log> Exemple de code avec fichier de configuration XML #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <string> #include <iostream> #include "gameforge/commun/log/Logger.hh" #include "gameforge/commun/log/Configurator.hh" using namespace std; using namespace gameforge::commun::log; int main(void) { try { Configurator::getInstance()->fromFile("commun/tests/log/config.xml", 5); LoggerPtr lc = Logger::getLogger("gameforge.client"); LoggerPtr ls = Logger::getLogger("gameforge.server"); LoggerPtr root = Logger::getRootLogger(); GFDEBUG(lc, "Entering in code"); GFERROR(root, "Pouet pouet 1"); GFDEBUG(root, "Pouet pouet 2"); GFERROR(ls, "Pouet pouet 3"); GFDEBUG(ls, "Pouet pouet 4"); Configurator::getInstance()->destroy(); return 0; } catch(exception &e) { cerr << e.what() << endl; return 1; } } |

