94 votes

Comment faire pour rediriger les qDebug, qWarning, qCritical etc sortie?

Je suis avec beaucoup d' qDebug() << des déclarations pour la sortie de débogage. Est-il de la croix-plate-forme de façon, je peux rediriger cette sortie de débogage dans un fichier, sans avoir recours à des scripts shell? Je devine que open() et dup2() va faire le travail sous Linux, mais ça va fonctionner compilé avec MinGW sous Windows?

Et peut-être il ya un Qt façon de le faire?

132voto

Nawaz Points 148870

Vous avez installer un gestionnaire de messages à l'aide de qInstallMsgHandler de la fonction, et ensuite, vous pouvez utiliser QTextStream écrire le debug message dans un fichier. Voici un exemple d'échantillon:

 #include <qapplication.h>
 #include <stdio.h>
 #include <stdlib.h>

 void myMessageOutput(QtMsgType type, const char *msg)
 {
     //in this function, you can write the message to any stream!
     switch (type) {
     case QtDebugMsg:
         fprintf(stderr, "Debug: %s\n", msg);
         break;
     case QtWarningMsg:
         fprintf(stderr, "Warning: %s\n", msg);
         break;
     case QtCriticalMsg:
         fprintf(stderr, "Critical: %s\n", msg);
         break;
     case QtFatalMsg:
         fprintf(stderr, "Fatal: %s\n", msg);
         abort();
     }
 }

 int main(int argc, char **argv)
 {
     qInstallMsgHandler(myMessageOutput); //install : set the callback
     QApplication app(argc, argv);
     ...
     return app.exec();
 }

Prises à partir de la doc de qInstallMsgHandler (j'ai seulement ajouté les commentaires):

Dans l'exemple ci-dessus, la fonction myMessageOutput utilise stderr qui vous voulez remplacer certains fichier de flux, ou complètement ré-écrire la fonction!

Une fois que vous écrivez et installer cette fonction, votre qDebug (ainsi que qWarning, qCritical etc) messages serait redirigé vers le fichier que vous avez écrit dans le gestionnaire. :-)

21voto

Sandeep Datta Points 7344

À partir d' ici, tout le crédit va à l'esprit.

#include <QApplication>
#include <QtDebug>
#include <QFile>
#include <QTextStream>

void myMessageHandler(QtMsgType type, const char *msg)
{
    QString txt;
    switch (type) {
    case QtDebugMsg:
        txt = QString("Debug: %1").arg(msg);
        break;
    case QtWarningMsg:
        txt = QString("Warning: %1").arg(msg);
    break;
    case QtCriticalMsg:
        txt = QString("Critical: %1").arg(msg);
    break;
    case QtFatalMsg:
        txt = QString("Fatal: %1").arg(msg);
    break;
    }
    QFile outFile("log");
    outFile.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream ts(&outFile);
    ts << txt << endl;
}

int main( int argc, char * argv[] )
{
    QApplication app( argc, argv );
    qInstallMsgHandler(myMessageHandler);   
    ...
    return app.exec();
}

6voto

Piotr Dobrogost Points 14412

Eh bien, je dirais que le moment où vous avez besoin de rediriger votre sortie de débogage pour quelque chose de différent que stderr, c'est quand vous pourriez penser sur certains outil de journalisation. Si vous en ressentez le besoin, je vous conseille d'utiliser l' QxtLogger ("La QxtLogger de classe est un outil facile à utiliser, facile à étendre outil de journalisation.") d' Qxt bibliothèque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X