Qt QDebug等重定向到文件中


源地址:http://blog.163.com/soyo_gogogo/blog/static/171414077201392705639321/

  Qt的qDebug() 等函數,可以打印出十分細致的log,用過你就會喜歡。現在要將qDebug() 等重定向到文件中。

        
使用Qt的MessageHandler可以將消息重定向。在Qt4.x時代,安裝一個消息處理器是用

qInstallMsgHandler

來安裝的。這個函數接受的一個函數指針作為參數,函數的定義是

 

 void funName(QtMsgType , const char *)

如筆者的一個小函數:

void messageOutput(QtMsgType, const char *msg)
{
 static QMutex mutex;
 mutex.lock();
 logFile->write(msg);
 logFile->write("\n");
 logFile->flush();
 mutex.unlock();
}
 
// Install it
qInstallMsgHandler(messageOutput);

logFile是一個全局的QFile類指針。

 

今天筆者使用Qt5.1版本來編寫程序。該函數編譯不通過。因為Qt 5.x后,這個函數被

qInstallMessageHandler

替代了。這個函數同樣接受一個函數指針作為參數,函數的定義是

void funName(QtMsgType , QMessageLogContext , const QString &)

可見,該函數中多了一個QMessageLogContext參數。這個參數包含了debug的一些基本信息,例如該debug所在的函數,所在的文件,所在的行數等。可以讓debug更加詳細。

筆者的一段小代碼

void MessageOutput(QtMsgType type , const QMessageLogContext &context , const QString &msg)
{
 static QMutex mutex;
 mutex.lock();
 
 QString log;
 switch(type)
 {
 case QtDebugMsg:
 log = QString("Debug: ");
 break;

 

 case QtWarningMsg:
 log = QString("Error: ");
 break;

 

 case QtCriticalMsg:
 log = QString("Critical Error: ");
 break;

 

 case QtFatalMsg:
 log = QString("Fatal Error: ");
 abort();
 break;

 

 default:
 log = QString("Unknow Msg Type : ");
 break;
 };

 

 log += QTime::currentTime().toString("hh:mm:ss.zzz, File: ") + QString(context.file) ;
 log += QString(", Line: " ) + QString::number(context.line) + QString(" : %1\n").arg(msg);
 logFile->write(log.toStdString().c_str());
 logFile->flush();

 

 mutex.unlock();
}

可以見到在最后面做了一些格式化的東西。這樣,debug看起來就是這樣的

Qt QDebug等重定向到文件中 - soooYo - ☆χιΑο.處
 

至於重定向到哪里,就看你的QFile打開的是哪個文件了。

 

這樣處理格式其實還不是那么優雅。像第一個函數那樣,沒有做任何格式化的操作,因為筆者在另外一個文件中做了格式化。

Qt QDebug等重定向到文件中 - soooYo - ☆χιΑο.處

 這個文件被命名為log.h。這樣,需要用到QDebug的地方,都可以#include"log.h"。

相信大家都明白了。

 

Enjoy your Qt.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM