天天看點

重格式化輸出QT的QDebug資訊

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!!!
           

以上方法,根據實際需要,自行選擇。

繼續閱讀