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