源地址:http://blog.163.com/soyo_gogogo/blog/static/171414077201392705639321/
Qt的qDebug() 等函數,可以打印出十分細致的log,用過你就會喜歡。現在要將qDebug() 等重定向到文件中。
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看起來就是這樣的
至於重定向到哪里,就看你的QFile打開的是哪個文件了。
這樣處理格式其實還不是那么優雅。像第一個函數那樣,沒有做任何格式化的操作,因為筆者在另外一個文件中做了格式化。
這個文件被命名為log.h。這樣,需要用到QDebug的地方,都可以#include"log.h"。
相信大家都明白了。
Enjoy your Qt.
