注明:以下方法仅适用于 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 << "
";
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 }
运行结果: