? 在Qt開(kāi)發(fā)過(guò)程當(dāng)中經(jīng)常使用qDebug等一些輸出來(lái)調(diào)試程序,但是到了正式發(fā)布的時(shí)候,都會(huì)被注釋或者刪除,采用日志輸出來(lái)代替。
做過(guò)項(xiàng)目的童鞋可能都使用過(guò)日志功能,以便有異常錯(cuò)誤能夠快速跟蹤、定位,Qt也提供的類(lèi)似的機(jī)制。之前用Qt4做項(xiàng)目時(shí)使用的是Qt::qInstallMsgHandler(),到了Qt5,使用了新的Qt::qInstallMessageHandler()來(lái)替代,詳情請(qǐng)查看Qt助手(C++ API changes)。
描述
? 助手中在C++ API changes中提到:Qt::qDebug()、Qt::qWarning()、Qt::qCritical()、Qt::qFatal()被改變?yōu)楹陙?lái)跟蹤源代碼的消息來(lái)源。被打印的信息可以被配置(用于缺省消息處理程序),通過(guò)設(shè)置該新的環(huán)境變量QT_MESSAGE_PATTERN。Qt::qInstallMsgHandler()已過(guò)時(shí),因此建議使用Qt::qInstallMessageHandler()來(lái)代替。
?
級(jí)別
qDebug:調(diào)試信息 qWarning:警告信息 qCritical:嚴(yán)重錯(cuò)誤 qFatal:致命錯(cuò)誤
?
官方示例
? ?
??需求(目的):生成log.txt日志文件,記錄詳細(xì)日志信息(包括等級(jí)、所在文件、所在行號(hào)、描述信息、產(chǎn)生時(shí)間等),以便于快速跟蹤、定位。
?
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);
?
????//注冊(cè)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版本的輸出卻沒(méi)有文件信息、行數(shù)等信息,如圖。
原因是:文件信息、行數(shù)等信息在Release版本默認(rèn)舍棄。我們只要在.pro文件定義一個(gè)宏
DEFINES?+=?QT_MESSAGELOGCONTEXT
DEFINES += QT_MESSAGELOGCONTEXT 然后,重新qmake,編譯(有可能要?jiǎng)h除掉之前編譯的中間文件),就可以在Release版本中正確輸出日志信息,如圖。