【Y忍冬草】QT:Log日誌功能實現

1.簡介

在利用QT進行開發的過程中經常會用到qDebug()來輸出調試信息,但當程序正式發佈時,這些都會被註釋或者刪除,這時我們就需要通過Log日誌輸出來代替。

 Log日誌是項目當中比用的功能,以便系統有錯誤是能夠快速跟蹤、定位,QT中提供類似的機制。在QT4中是通過Qt::qInstallMsgHandler()實現,但在QT5中使用了新的Qt::qInstallMessageHandler()來代替,詳情請查看QT助手。

2.QT調試級別

  • qDebug() 調試消息
  • qInfo() 信息消息
  • qWarning() 警告消息和可恢復的錯誤
  • qCritical() 關鍵錯誤和系統錯誤
  • qFatal() 致命錯誤

3.代碼

#include <QCoreApplication>
#include <QFile>
#include <QMutex> // 互鎖頭文件
#include <QTextStream>
#include <QDateTime>

void MessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    static QMutex mutex;
    mutex.lock();

    QString text;
    switch (type)
    {
    case QtDebugMsg:
        text = QString("Debug:");
        break;
    case QtInfoMsg:
        text = QString("Info:");
        break;
    case QtWarningMsg:
        text = QString("Warning:");
        break;
    case QtCriticalMsg:
        text = QString("Critical:");
        break;
    case QtFatalMsg:
        text = QString("Fatal:");
    default:
        break;
    }

    QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
    QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
    QString currentDate = QString("(%1)").arg(currentTime);
    QString message = QString::fromLocal8Bit("【%1】%2 %3 %4").arg(currentTime).arg(text).arg(msg).arg(context_info);

    QString path = QCoreApplication::applicationDirPath();
    QFile file(path + "/log.txt");
    file.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream textStream(&file);
    textStream << message << "\r\n";
    file.flush();
    file.close();

    mutex.unlock();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qInstallMessageHandler(MessageHandler);

    //打印日誌到文件中
    qDebug("This is a debug message");          //  qDebug:調試信息
    qInfo("This is a information message");     //  Info:   信息消息
    qWarning("This is a warning message");      //  qWarning:警告信息
    qCritical("This is a critical message");    //  qCritical:嚴重錯誤
    qFatal("This is a fatal message");          //  qFatal:致命錯誤(會報錯,然後準備退出)

    return a.exec();

}

 在這使用QMutex進行加鎖、解鎖操作,便於我們可以安全的在多線程操作中使用。QFile打開模式爲QIODevice::ReadWrite | QIODevice::Append(讀寫、追加模式),保證了輸出信息可以以追加的形式寫入文件。

4.結果:

在這裏插入圖片描述
在這裏插入圖片描述

5.注意

 以上調試結果信息在Debug模式下輸出是沒問題的,但是在Release模式下是默認不輸出文件名、行號等信息,

 這時只需要在.pro文件中加入以下宏定義:

DEFINES += QT_MESSAGELOGCONTEXT

之後,重新qmake編譯既可以。

6.參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章