вторник, 1 апреля 2014 г.

Qt: Запись отладочной информации в файл

В тех случаях, если отладка в среде разработки недоступна, например при создании служб Windows, приходится писать отладочную информацию в файл. Чтобы сделать это в Qt и при этом не изобретать велосипед, можно воспользоватся встроенными методами qDebug, qWarning, qCritical, qFatal.

По умолчанию эти методы выводят сообщения в консоль. Чтобы перенаправить вывод в файл, необходимо воспользоватся методом qInstallMsgHandler(). Делается это так:

#include <QFile>
#include <QDateTime>
#include <QDebug>
#include <QTextStream>
//...
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    qInstallMsgHandler(myMessageOutput);
    qDebug("Hello World!\n");

    MainWindow w;
    w.show();
    
    return app.exec();
}

Метод myMessageOutput() определяется следующим образом:

void myMessageOutput(QtMsgType type, const char *msg){
    QFile fMessFile(qApp->applicationDirPath() + "/log.txt");
    if(!fMessFile.open(QIODevice::Append | QIODevice::Text)){
        return;
    }
    QString sCurrDateTime = "[" + 
              QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss.zzz") + "]";
    QTextStream tsTextStream(&fMessFile);
    switch(type){
    case QtDebugMsg:
        tsTextStream << QString("%1 Debug - %2").arg(sCurrDateTime).arg(msg);
        break;
    case QtWarningMsg:
        tsTextStream << QString("%1 Warning - %2").arg(sCurrDateTime).arg(msg);
        break;
    case QtCriticalMsg:
        tsTextStream << QString("%1 Critical - %2").arg(sCurrDateTime).arg(msg);
        break;
    case QtFatalMsg:
        tsTextStream << QString("%1 Fatal - %2").arg(sCurrDateTime).arg(msg);
        abort();
    }
    tsTextStream.flush();
    fMessFile.flush();
    fMessFile.close();
}

Удачи!

Комментариев нет:

Отправить комментарий