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 :
  1. Je veux mettre des logs dans mon programme sous forme de stream
  2. Ces logs sont sauvegardés dans un fichier
  3. Je veux choisir et loguer des 'channels', c'est à dire des catégories de log : réseau, thred, synchro, gameplay ...
  4. Je veux choisir et loguer la sévérité
  5. Mon programme étant multi-thread, je veux loguer le threadID
  6. 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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
TRACE(Network,info) << "Logs enableds" << 4;
Et voici ce que j'obtiens :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.