Qt5 調試之詳細日志文件輸出(qInstallMessageHandler)


注明:以下方法僅適用於 Qt5 及以上版本 

函數說明

QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)

  此函數在使用Qt消息處理程序之前已定義。返回一個指向前一個消息處理程序。
  消息處理程序是一個函數,用於打印
qDebug,qWarning,qCriticalqFatal的錯誤消息。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 }

 

運行結果

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM