注明:以下方法僅適用於 Qt5 及以上版本
函數說明:
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
此函數在使用Qt消息處理程序之前已定義。返回一個指向前一個消息處理程序。
消息處理程序是一個函數,用於打印qDebug,qWarning,qCritical和qFatal的錯誤消息。Qt庫(調試模塊)包含成百上千的警告信息,打印時(通常是無效的函數參數)發生內部錯誤。Qt構建在release模式下還包含一些除了QT_NO_WARNING_OUTPUT和/或QT_NO_DEBUG_OUTPUT之外的警告已經設置在編譯。如果你實現自己的消息處理程序,需要完全控制這些消息。
在X11或Windows下的調試器,缺省的消息處理程序向標准輸出打印消息。如果這是一個致命的消息,應用程序立即中止。
只有一個消息處理程序可以被定義,因為這通常是在應用程序的基礎上完成控制調試輸出。
恢復消息處理程序,調用qInstallMessageHandler(0)。
調試級別:
qDebug: 調試信息
qWarning:警告信息
qCritical: 嚴重錯誤
qFatal: 致命錯誤
目的:生成log.txt日志文件,記錄詳細日志信息(包括等級、所在文件、所在行號、描述信息、產生時間等),以便於快速跟蹤、定位。
代碼:
1 #include "widget.h" 2 #include <QApplication> 3 4 #include <QtDebug> 5 #include <QFile> 6 #include <QTextStream> 7 #include <QDebug> 8 #include <QDateTime> 9 #include <QMutex> 10 #include <QString> 11 #include <qapplication.h> 12 13 void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg) 14 { 15 // 加鎖 16 static QMutex mutex; 17 mutex.lock(); 18 19 QString text; 20 21 switch(type) 22 { 23 case QtDebugMsg: 24 text = QString("Debug:"); 25 break; 26 27 case QtWarningMsg: 28 text = QString("Warning:"); 29 break; 30 31 case QtCriticalMsg: 32 text = QString("Critical:"); 33 break; 34 35 case QtFatalMsg: 36 text = QString("Fatal:"); 37 } 38 39 // 設置輸出信息格式 40 QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line); 41 QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd"); 42 QString current_date = QString("(%1)").arg(current_date_time); 43 QString message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date); 44 45 // 輸出信息至文件中(讀寫、追加形式) 46 QFile file("log.txt"); 47 file.open(QIODevice::WriteOnly | QIODevice::Append); 48 QTextStream text_stream(&file); 49 text_stream << message << "\r\n"; 50 file.flush(); 51 file.close(); 52 53 // 解鎖 54 mutex.unlock(); 55 } 56 57 int main(int argc, char *argv[]) 58 { 59 QApplication app(argc, argv); 60 61 //注冊MessageHandler 62 qInstallMessageHandler(outputMessage); 63 64 Widget w; 65 w.debtest(); 66 w.show(); 67 //打印日志到文件中 68 qDebug("This is a debug message"); 69 qWarning("This is a warning message"); 70 qCritical("This is a critical message"); 71 qFatal("This is a fatal message"); 72 73 return app.exec(); 74 }
運行結果: