Qt Weekly #1 : Catégorisation des messages de sortie

Catégorisation des messages de sortie

La catégorisation des messages de sortie structure les différents messages en catégories, avec une configuration des différentes catégories en un endroit central. Cette fonctionnalité fait partie de Qt 5.2 mais a reçu de nombreuses améliorations dans Qt 5.3.

Article lu   fois.

Les trois auteurs et traducteur

Traducteur : Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Catégories des messages

Jetons un coup d'œil à un exemple. Considérons que vous travaillez sur un nouveau jeu totalement révolutionnaire nommé « FlappyCat », qui propose de sauvegarder les meilleurs scores :

 
Sélectionnez
bool Highscore::load(const QString &filepath)
{
    QLoggingCategory fcIo("fc.io");
    qCDebug(fcIo) << "Chargement des meilleurs scores…";
 
    QFile file(filepath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qCWarning(fcIo) << "Impossible d'ouvrir le fichier " << filepath << " !";
        return;
    }
    // ...
}

Ce code affiche :

 
Sélectionnez
fc.io: Chargement des meilleurs scores…
fc.io: Impossible d'ouvrir le fichier "highscore.xml" !

Que se passe-t-il ici ?

  • QLoggingCategory représente une catégorie dans le code (dans ce cas, fc.io). Il ne s'agit pas forcément d'une bijection : plusieurs instances de cette classe peuvent représenter une seule et même catégorie.
  • qCDebug, qCWarning et qCCritical vous permettent d'afficher les messages dans des catégories spécifiques. Ils vérifient aussi que la catégorie a bien été activée avant d'assembler le message afin de s'assurer que l'ajout de messages est peu coûteux en ressources (c'est la raison pour laquelle il n'est pas possible de se contenter de redéfinir qDebug() et consorts).
  • QtMessageHandler affiche par défaut le nom de la catégorie au début du message.

De façon alternative, vous pouvez aussi définir toutes les catégories au même endroit. Ci-dessous le fichier d'en-tête, puis celui d'implémentation :

 
Sélectionnez
#include <QLoggingCategory>
Q_DECLARE_LOGGING_CATEGORY(fcIo)
Q_DECLARE_LOGGING_CATEGORY(fcRender)
Q_DECLARE_LOGGING_CATEGORY(fcLogic)
 
Sélectionnez
#include "fclogging.h"
Q_LOGGING_CATEGORY(fcIo, "fc.io")
Q_LOGGING_CATEGORY(fcRender, "fc.render")
Q_LOGGING_CATEGORY(fcLogic, "fc.logic")

Les macros Q_DECLARE_LOGGING_CATEGORY et Q_LOGGING_CATEGORY permettent de facilement définir des catégories globales.

II. Règles pour les messages de sortie

Voyons maintenant comment peaufiner les catégories afin d'activer ou de désactiver les niveaux individuellement.

 
Sélectionnez
int main(int argc, char **argv)
{
    QGuiApplication app(argc, argv);
    QLoggingCategory::setFilterRules("*.debug=false\n"
                                     "fc.io.debug=true");
    // ...
}

Les règles pour les messages de sortie sont écrites au format texte et sont appliquées en appelant setFilterRules(). Dans ce cas, la première règle désactive la sortie de QtDebugMsg, et ce, pour toutes les catégories, tandis que la seconde écrase la précédente en ce qui concerne la catégorie « fc.io ».

III. Fichier de configuration des messages de débogage (à partir de Qt 5.3)

Quoi qu'il en soit, il n'est pas pratique de devoir recompiler son application uniquement pour modifier les messages de sortie. C'est pourquoi Qt 5.3 vous permet de passer par un fichier de configuration.

~/.config/QtProject/qtlogging.ini
Sélectionnez
[rules]
*.debug=false
fc.io.debug=true

Le fichier de configuration est recherché à différents endroits, selon la plate-forme. Une autre nouveauté sympathique de Qt 5.3 est la possibilité d'utiliser les catégories à la manière de printf :

 
Sélectionnez
qCDebug(fcIo, "Loading highscore ...");

Vous êtes encouragé à lire la documentation de Qt 5.3, dès qu'elle sera disponible.

IV. Remerciements

Au nom de toute l'équipe Qt, j'aimerais adresser le plus grand remerciement à KDAB pour nous avoir autorisés à traduire cet article !

Je tiens à remercier Alexandre Laurent pour ses conseils ainsi que Jacques Théry pour sa relecture.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2014 Kai Koehne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.