QT-Creator的qDebug()输出调试信息很方便,并且可以简单的重定向保存为log文件。但是qDebug()输出的信息没有直接带上当前文件名和行号,甚至当前系统日期时间等信息。
这里介绍一个方法重新格式化qDebug()输出信息,可以添加上你需要显示的额外信息,同时保存成log文件。
QtMessageHandler gDefaultHandler = NULL;
// get default handler of message handler
gDefaultHandler = qInstallMessageHandler(myMessageOutput);
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QString strMsg("");
switch(type)
{
case QtDebugMsg:
strMsg = QString("Debug:");
break;
case QtInfoMsg:
strMsg = QString("Info:");
break;
case QtWarningMsg:
strMsg = QString("Warning:");
break;
case QtCriticalMsg:
strMsg = QString("Critical:");
break;
case QtFatalMsg:
strMsg = QString("Fatal:");
break;
default:
strMsg = QString("Err:");
break;
}
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString current_date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QString message = QString("%1 %2 %3 %4").arg(current_date).arg(strMsg).arg(context_info).arg(msg);
// lock
static QMutex mutex;
mutex.lock();
// output to the file log.txt
QFile file("D:\\log.txt");
file.open(QIODevice::ReadWrite | QIODevice::Append);
QTextStream stream(&file);
stream << message << "\r\n";
file.flush();
file.close();
// unlock
mutex.unlock();
// display debug info in IDE
if (gDefaultHandler)
{
gDefaultHandler(type, context, message);
}
}
在QT-Creator的应用程序输出栏里显示的效果如下:
//qDebug("hello world!!");
2019-05-05 10:37:19 Debug: File:(test.cpp) Line:(583) hello world!!
为了避免release版本里文件名context.file、函数名context.function、行数context.line消失的问题,需要在pro文件里加入以下选项,然后重编译以保证该选项生效。
DEFINES += QT_MESSAGELOGCONTEXT
另一方法,无需重设置qInstallMessageHandler,可以在每次调用qDebug()时,输入文件名和行数,如下:
qDebug("File: %s Line: %d hello world!!!", __FILE__, __LINE__);
//File: test.cpp Line:583 hello world!!!
以上方法,根据实际需要,自行选择。