Bonjour,
<JeVousRaconteMaVie : on>
J'ai passé la première moitié de ma journée à installer boost log, de façon à pouvoir compiler sur ma machine windows avec le MinGW embarqué dans Code::Blocks.
Je vous assure que ce n'est pas simple, si ça intéresse quelqu'un j'envoie un tutoriel contre 3 timbres 
Enfin, finalement j'ai réussi
<JeVousRaconteMaVie : off>
J'ai ensuite passé la seconde moitié de ma journée à essayer de comprendre comment ça marche et franchement, je trouve que la documentation est TRES mal écrite.
Enfin, bref voilà, j'abandonne. Si quelqu'un peut m'aider ce serait sympa.
Voici ce que je voudrais faire :
- Je veux mettre des logs dans mon programme sous forme de stream
- Ces logs sont sauvegardés dans un fichier
- Je veux choisir et loguer des 'channels', c'est à dire des catégories de log : réseau, thred, synchro, gameplay ...
- Je veux choisir et loguer la sévérité
- Mon programme étant multi-thread, je veux loguer le threadID
- Mon programme étant client/serveur, je veux loguer le processId
Voici à quoi devrait ressembler mon fichier de log à la fin :
En supposant que :
- ccc est le pid d'un client
- sss est le pid d'un server
- 1111 2222 3333 sont les threadID de différents thread du client et du serveur.
- il est 14h34, 23 secondes et quelques millièmes au moment où ces logs sont générés.
1 2 3 4 5 6 7 8 9 10 11
|
..
[ccc][1111][14:34:23 112][Network][Info] Tentative de connexion au Seveur
[sss][2222][14:34:23 237][Network][Info] Connexion entrante
[sss][2222][14:34:23 248][Network][Info] Création dune session
[sss][2222][14:34:23 324][Thread][Debug] Nouveau Thread
[sss][3333][14:34:23 567][Network][Info] Session crée
[ccc][1111][14:34:23 945][Network][Info] Connexion active
[sss][3333][14:34:24 112][Network][Warning] Session interrompue
[ccc][1111][14:34:24 112][Network][Error] Connexion interrompue
... |
Voilà ce qui marche :
Déclaration
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Trace
{
public :
enum SeverityLevels {...}; // mes niveaux de sécurité
enum Channels{...}; // mes channels
typedef boost::log::sources::severity_channel_logger_mt<
SeverityLevels, // the type of the severity level
Channels // the type of the channel name
> MyLogger; // le type de mes logger
public :
static MyLogger m_channel1; // un loger par channel
static MyLogger m_channel2; // un loger par channel
...
public :
static void init(); // initialisation les logers/sinks...
};
} |
Implémentation :
1 2 3 4 5 6 7 8 9
| void Trace::init()
{
boost::log::add_common_attributes(); // j'ajoute les attributs de base (en l'occurence ProcessId, ThreadId et TimeStamp
init_log_to_file
(
...
boost::log::keywords::format = "[%ProcessID%][%ThreadID%][%TimeStamp%][%Channel%][%Severity%]: %_%"
);
} |
Et après j'ai fait une macro pour pouvoir l'utiliser comme ça :
TRACE(Network,info) << "Logs enableds" << 4;
Et voici ce que j'obtiens :
1 2 3 4 5
| [000000x2c0][0x246788][2010-Oct-02 23:10:57.156250][][]: Logs enableds
...
[000000x2c0][0x2478f0][2010-Oct-02 23:11:04.265625][][]: Client started
...
[00000x141c][0x247a98][2010-Oct-02 23:11:04.281250][][]: Nouvelle session |
Comme vous l'aurez deviné, mon problème est maintenant de faire apparaitre le channel et le niveau de sévérité
J'ai tenté de modifier le code d'initialisation ci-dessus, comme ceci :
1 2 3
| boost::shared_ptr< boost::log::sinks::synchronous_sink< boost::log::sinks::basic_text_file_backend< char > > > pBackend;
pBackend = boost::log::init_log_to_file(...); // je récupère le frontend du sink créé
pBackend->locked_backend()->set_formatter(boost::log::formatters::stream << boost::log::formatters::attr< Channels >("Channel")); // j'essaie d'ajouter un formater au backend associé. |
Et quelque part, je définis :
1 2 3 4
| std::ostream& operator<< (std::ostream& strm, Trace::Channels const& val)
{
...
} |
.
Le résultat que j'obtiens : ça compile, ça linke, ça s'exécute sans lancer d'exception, mais mon fichier de logs est irrémédiablement vide.
Merci déjà à ceux qui ont lu ce long post.
Merci d'autant plus à ceux qui pourront m'aider.
Partager