QT-Creator的qDebug()輸出調試資訊很友善,并且可以簡單的重定向儲存為log檔案。但是qDebug()輸出的資訊沒有直接帶上目前檔案名和行号,甚至目前系統日期時間等資訊。
這裡介紹一個方法重新格式化qDebug()輸出資訊,可以添加上你需要顯示的額外資訊,同時儲存成log檔案。
QtMessageHandler gDefaultHandler = NULL;
// get default handler of message handler
gDefaultHandler = qInstallMessageHandler(myMessageOutput);
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QString strMsg("");
switch(type)
{
case QtDebugMsg:
strMsg = QString("Debug:");
break;
case QtInfoMsg:
strMsg = QString("Info:");
break;
case QtWarningMsg:
strMsg = QString("Warning:");
break;
case QtCriticalMsg:
strMsg = QString("Critical:");
break;
case QtFatalMsg:
strMsg = QString("Fatal:");
break;
default:
strMsg = QString("Err:");
break;
}
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString current_date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QString message = QString("%1 %2 %3 %4").arg(current_date).arg(strMsg).arg(context_info).arg(msg);
// lock
static QMutex mutex;
mutex.lock();
// output to the file log.txt
QFile file("D:\\log.txt");
file.open(QIODevice::ReadWrite | QIODevice::Append);
QTextStream stream(&file);
stream << message << "\r\n";
file.flush();
file.close();
// unlock
mutex.unlock();
// display debug info in IDE
if (gDefaultHandler)
{
gDefaultHandler(type, context, message);
}
}
在QT-Creator的應用程式輸出欄裡顯示的效果如下:
//qDebug("hello world!!");
2019-05-05 10:37:19 Debug: File:(test.cpp) Line:(583) hello world!!
為了避免release版本裡檔案名context.file、函數名context.function、行數context.line消失的問題,需要在pro檔案裡加入以下選項,然後重編譯以保證該選項生效。
DEFINES += QT_MESSAGELOGCONTEXT
另一方法,無需重設定qInstallMessageHandler,可以在每次調用qDebug()時,輸入檔案名和行數,如下:
qDebug("File: %s Line: %d hello world!!!", __FILE__, __LINE__);
//File: test.cpp Line:583 hello world!!!
以上方法,根據實際需要,自行選擇。