? 在Qt開發(fā)過程當(dāng)中經(jīng)常使用qDebug等一些輸出來調(diào)試程序,但是到了正式發(fā)布的時候,都會被注釋或者刪除,采用日志輸出來代替。
做過項目的童鞋可能都使用過日志功能,以便有異常錯誤能夠快速跟蹤、定位,Qt也提供的類似的機制。之前用Qt4做項目時使用的是Qt::qInstallMsgHandler(),到了Qt5,使用了新的Qt::qInstallMessageHandler()來替代,詳情請查看Qt助手(C++ API changes)。
描述
? 助手中在C++ API changes中提到:Qt::qDebug()、Qt::qWarning()、Qt::qCritical()、Qt::qFatal()被改變?yōu)楹陙砀櫾创a的消息來源。被打印的信息可以被配置(用于缺省消息處理程序),通過設(shè)置該新的環(huán)境變量QT_MESSAGE_PATTERN。Qt::qInstallMsgHandler()已過時,因此建議使用Qt::qInstallMessageHandler()來代替。
?
級別
qDebug:調(diào)試信息 qWarning:警告信息 qCritical:嚴(yán)重錯誤 qFatal:致命錯誤
?
官方示例
? ?
??需求(目的):生成log.txt日志文件,記錄詳細日志信息(包括等級、所在文件、所在行號、描述信息、產(chǎn)生時間等),以便于快速跟蹤、定位。
?
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
????static QMutex mutex;
????mutex.lock();
?
????QString text;
????switch(type)
????{
????case QtDebugMsg:
????????text = QString("Debug:");
????????break;
?
????case QtWarningMsg:
????????text = QString("Warning:");
????????break;
?
????case QtCriticalMsg:
????????text = QString("Critical:");
????????break;
????case QtFatalMsg:
????????text = QString("Fatal:");
????}
????QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
????QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
????QString current_date = QString("(%1)").arg(current_date_time);
????QString message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);
?
????QFile file("log.txt");
????file.open(QIODevice::WriteOnly | QIODevice::Append);
????QTextStream text_stream(&file);
????text_stream << message << "rn";
????file.flush();
????file.close();
????mutex.unlock();
}
int main(int argc, char *argv[])
{
????QApplication app(argc, argv);
?
????//注冊MessageHandler
????qInstallMessageHandler(outputMessage);
?
????//打印日志到文件中
????qDebug("This is a debug message");
????qWarning("This is a warning message");
????qCritical("This is a critical message");
????qFatal("This is a fatal message");
?
????return app.exec();
}
注意!注意!注意!
Release版本的輸出卻沒有文件信息、行數(shù)等信息,如圖。
原因是:文件信息、行數(shù)等信息在Release版本默認舍棄。我們只要在.pro文件定義一個宏
DEFINES?+=?QT_MESSAGELOGCONTEXT
DEFINES += QT_MESSAGELOGCONTEXT 然后,重新qmake,編譯(有可能要刪除掉之前編譯的中間文件),就可以在Release版本中正確輸出日志信息,如圖。