Qt日誌輸出至檔案
阿新 • • 發佈:2018-12-31
轉自:http://blog.sina.com.cn/s/blog_a6fb6cc90101guc5.html。
在Qt開發過程當中經常使用qDebug等一些輸出來除錯程式,但是到了正式釋出的時候,都會被註釋或者刪除,在後期定位問題清楚易見起見,採用日誌輸出來代替。
Qt5,使用了新的Qt::qInstallMessageHandler()來替代,詳情請檢視Qt助手(C++ API changes)。
描述
助手中在C++ API changes中提到:Qt::qDebug()、Qt::qWarning()、Qt::qCritical()、Qt::qFatal()被改變為巨集來跟蹤原始碼的訊息來源。被列印的資訊可以被配置(用於預設訊息處理程式),通過設定該新的環境變數QT_MESSAGE_PATTERN。Qt::qInstallMsgHandler()已過時,因此建議使用Qt::qInstallMessageHandler()來代替。
級別
qDebug:除錯資訊
qWarning:警告資訊
qCritical:嚴重錯誤
qFatal:致命錯誤
需求(目的):生成log.txt日誌檔案,記錄詳細日誌資訊(包括等級、所在檔案、所在行號、描述資訊、產生時間等),以便於快速跟蹤、定位。
下述程式碼
#include <qapplication.h> #include <stdio.h> #include <stdlib.h> #include <QDebug> #include <QTextStream> #include <QDateTime> #include <QFile> #define LOGFILEMAX 10000 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 << "\r\n"; 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(); }