qInstallMessageHandler把输出信息写入文件和显示在调试窗
qInstallMessageHandler来实现输出详细日志,输出文件名,行号,所在函数及事件,并写入文件。最后调用系统原来的函数,使信息像之前一样输出到调试窗口,便于开发。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #ifndef DLOG_H #define DLOG_H #include <qapplication.h> #include <QDateTime> #include <QFile> #include <QTextStream> #include <QtMsgHandler> #include <QMessageLogContext> #include <QMutex> void myMsgOutput(QtMsgType type, const QMessageLogContext &context, const QString& msg) { static QMutex mutex; mutex.lock(); QString time=QDateTime::currentDateTime().toString(QString("[ yyyy-MM-dd HH:mm:ss:zzz ]")); QString mmsg; switch(type) { case QtDebugMsg: mmsg=QString("%1: Debug:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); break; case QtInfoMsg: mmsg=QString("%1: Info:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); break; case QtWarningMsg: mmsg=QString("%1: Warning:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); break; case QtCriticalMsg: mmsg=QString("%1: Critical:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); break; case QtFatalMsg: mmsg=QString("%1: Fatal:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); abort(); } QFile file("debug.txt"); file.open(QIODevice::ReadWrite | QIODevice::Append); QTextStream stream(&file); stream << mmsg << "\r\n"; file.flush(); file.close(); mutex.unlock(); } #endif
|
上面代码里使用gDefaultHandler 保留了qInstallMessageHandler返回的系统原来的函数,最后再调用。这样qDebug()、qInfo()的信息和之前一样写入调试窗口,同时也写入了文件。
Release 版本默认不包含这些信息:文件名、函数名、行数,需要在项目文件加入以下代码,加入后最好重新构建项目使之生效:
xxx.pro:
1
| DEFINES += QT_MESSAGELOGCONTEXT
|
main.cpp:
1 2 3 4 5
| #include "tool/dlog.h"
void main() { qInstallMessageHandler(myMsgOutput); }
|
参考链接:https://blog.csdn.net/sunbo94/article/details/79778905