1. 程式人生 > >QT中除錯資訊輸出到日誌檔案

QT中除錯資訊輸出到日誌檔案

轉自:http://www.cppblog.com/seahouse/archive/2011/03/22/142116.html

一、基本分類:
qDebug : 除錯資訊提示
qWarning: 一般的警告提示
qCritical: 嚴重錯誤提示
qFatal: 致命錯誤提示

二、如何截獲這些資訊

Qt提供了qInstallMsgHandler 方法用來定製訊息發生後如何來處理。
qInstallMsgHandler 是一個回撥函式,主要是由qDebug、qWarnng、qCritical、qFatal這些函式進行觸發,
也就是說,qDeubg這些函式處理的訊息文字會被qInstallMsgHandler 所指向的回撥函式截獲,這樣就允許使用者自己來處理這些訊息文字。
例如,你完全可以將這些訊息文字輸出並儲存到相關的日誌檔案中。請看下面的示例!

三、將qDebug()\qWarning()\qCritical()\qFatal() 資訊輸出到指定檔案中

  1. #include <QtDebug>
  2. #include <QFile>
  3. #include <QTextStream>
  4. void customMessageHandler(QtMsgType type, const char *msg)      //在main函式之前定義回撥函式
  5. {
  6.         QString txt;
  7.         switch (type) {
  8.         //除錯資訊提示
  9.         case QtDebugMsg:
  10.                 txt = QString("Debug: %1").arg(msg);
  11.                 break;
  12.         //一般的warning提示
  13.         case QtWarningMsg:
  14.                 txt = QString("Warning: %1").arg(msg);
  15.         break;
  16.         //嚴重錯誤提示
  17.         case QtCriticalMsg:
  18.                 txt = QString("Critical: %1").arg(msg);
  19.         break;
  20.         //致命錯誤提示
  21.         case QtFatalMsg:
  22.                 txt = QString("Fatal: %1").arg(msg);
  23.                 abort();
  24.         }
  25.         QFile outFile("debuglog.txt");
  26.         outFile.open(QIODevice::WriteOnly | QIODevice::Append);
  27.         QTextStream ts(&outFile);
  28.         ts << txt << endl;
  29. }
  30. int main( int argc, char * argv[] )
  31. {
  32.         QApplication app( argc, argv );
  33.         //在面函式中註冊自己的MsgHandler
  34.         qInstallMsgHandler(customMessageHandler);        
  35.         //以後就可以像下面這樣直接打日誌到檔案中,而且日誌也會包含時間資訊
  36.         qDebug("This is a debug message at thisisqt.com");
  37.         qWarning("This is a warning message  at thisisqt.com");
  38.         qCritical("This is a critical message  at thisisqt.com");
  39.         qFatal("This is a fatal message at thisisqt.com");
  40.         return app.exec();
  41. }

四、如何取消資訊處理呢?
簡單:
還是用qInstallMsgHandler.
只要執行qInstallMsgHandler(0) 就可以了