Projet

Général

Profil

AbulEduLoggerV1

Cette librairie est incluse dans AbulEduApplicationV1.

git submodule add http://redmine.abuledu.org/ryxeo/leterrier-developpeurs/abuleduloggerv1.git src/lib/abuleduloggerv1

Mainteneur de la lib:

git clone ssh://gitolite3@redmine.abuledu.org/repositories-redmine/ryxeo/leterrier-developpeurs/abuleduloggerv1.git

Elle permet de définir une cible de sortie pour les debugs en temps réel (stderr/console par défaut).
Elle ajoute également la possibilité d'écrire les debugs dans un fichier en définissant un fichier de sortie.

Attention, le développeur n'a rien à faire est tout est défini dans la classe AbulEduApplicationV1.
Cependant, même si la classe AbulEduLoggerV1 est incluse dans AbulEduApplicationV1, le développeur doit inclure le fichier d'entête et doit définir les debugs qu'il estime nécessaire.
Il existe une hiérarchie des debugs calquée sur celle des QDebugs :

enum AbulEduLogLevelV1
{
    TraceLevel = 0,
    DebugLevel,
    InfoLevel,
    WarnLevel,
    ErrorLevel,
    FatalLevel,
    OffLevel
};

Utilisation

Pour utiliser AbulEduLoggerV1 dans sa classe, il n'y rien à faire car inclut par la classe AbulEduApplicationV1
Il faut juste vérifier qu'on inclut bien abuleduapplication.h

#include "abuleduapplicationv1.h" 

Pour débugger, utiliser ces macros selon l'importance de l'information, il faut utiliser la même syntaxe que qDebug() :

ABULEDU_LOG_TRACE() << "ma trace";
ABULEDU_LOG_DEBUG() << "mon debug";
ABULEDU_LOG_INFO()  << "mon info";
ABULEDU_LOG_WARN()  << "mon warning";
ABULEDU_LOG_ERROR() << "mon erreur";
ABULEDU_LOG_FATAL() << "oh oh gros problème";

Pour désactiver les logs dans une classe, il ne faut pas toucher aux macros déjà inscrites dans votre code, mais inclure un fichier spéciale :

#include "abuleduapplicationv1.h" 
// Cette include désactive les logs pour cette classe
#include "abuledudisableloggerv1.h" 

int main(int argc, char *argv[])
{
    AbulEduApplicationV1 a(argc, argv, "appName", "appVersion", "organizationDomain", "organizationName", "unitVersion");

    ABULEDU_LOG_DEBUG() << "Mon debug qui ne sera pas écrit/débuggué car j'ai inclus abuledudisableloggerv1.h";

    return a.exec();
}

Log et build stable

Il est peut-être (même sûrement) pas nécessaire de debugger/logguer les programmes chez les clients.
Lors de build RC, cela se justifie : le testeur peut voir ce qui se passe, nous envoyer ce qui se passe.
Mais en production.. Il est même possible que certaines informations sensibles soient logguées...

Il est donc possible d'écarter tous les logs lors d'une compilation stable.
Voici ce qu'il faut coller dans le .pro :

CONFIG(debug, debug|release) {
     QMAKE_CXXFLAGS_DEBUG += -g3 -O0
     message("DEBUG!") } 
else {     
     DEFINES += QT_NO_DEBUG     
     DEFINES += QT_NO_DEBUG_OUTPUT     
     DEFINES += ABULEDU_LOG_DISABLE     
     message("RELEASE!") 
}

Les logs seront désactivés.

Limite de la classe

Bon, nous nous heurtons à plusieurs problèmes.

La politique du "#define" pour activer les debugs ou non fait que nous ne pouvons pas activer les debugs à la volée (ie à l'exécution).
Donc, impossible de créer un fichier de conf pour des réglages (le debug.pri est pris en considération pendant la compilation, plus particulièrement pendant le qmake).

J'ai donc effectuer quelques recherches. J'ai testé un POC utilisant les nouveautés de Qt5 suivantes :

  • QMessageLogger
  • Q_LOGGING_CATEGORY
  • Logging Rules (fichier ini qui permet d'activer ou de désactiver les logs à l'exécution)
  • messageHandler avec Mutex pour l'écriture du fichier log

L'implémentation à l'air (en tout cas dans mon POC) beaucoup plus souple.
Cependant, c'est only Qt5 !

Redmine Appliance - Powered by TurnKey Linux