1.简介
在利用QT进行开发的过程中经常会用到qDebug()来输出调试信息,但当程序正式发布时,这些都会被注释或者删除,这时我们就需要通过Log日志输出来代替。
Log日志是项目当中比用的功能,以便系统有错误是能够快速跟踪、定位,QT中提供类似的机制。在QT4中是通过Qt::qInstallMsgHandler()实现,但在QT5中使用了新的Qt::qInstallMessageHandler()来代替,详情请查看QT助手。
2.QT调试级别
- qDebug() 调试消息
- qInfo() 信息消息
- qWarning() 警告消息和可恢复的错误
- qCritical() 关键错误和系统错误
- qFatal() 致命错误
3.代码
#include <QCoreApplication>
#include <QFile>
#include <QMutex> // 互锁头文件
#include <QTextStream>
#include <QDateTime>
void MessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
mutex.lock();
QString text;
switch (type)
{
case QtDebugMsg:
text = QString("Debug:");
break;
case QtInfoMsg:
text = QString("Info:");
break;
case QtWarningMsg:
text = QString("Warning:");
break;
case QtCriticalMsg:
text = QString("Critical:");
break;
case QtFatalMsg:
text = QString("Fatal:");
default:
break;
}
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
QString currentDate = QString("(%1)").arg(currentTime);
QString message = QString::fromLocal8Bit("【%1】%2 %3 %4").arg(currentTime).arg(text).arg(msg).arg(context_info);
QString path = QCoreApplication::applicationDirPath();
QFile file(path + "/log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream textStream(&file);
textStream << message << "\r\n";
file.flush();
file.close();
mutex.unlock();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qInstallMessageHandler(MessageHandler);
//打印日志到文件中
qDebug("This is a debug message"); // qDebug:调试信息
qInfo("This is a information message"); // Info: 信息消息
qWarning("This is a warning message"); // qWarning:警告信息
qCritical("This is a critical message"); // qCritical:严重错误
qFatal("This is a fatal message"); // qFatal:致命错误(会报错,然后准备退出)
return a.exec();
}
在这使用QMutex进行加锁、解锁操作,便于我们可以安全的在多线程操作中使用。QFile打开模式为QIODevice::ReadWrite | QIODevice::Append
(读写、追加模式),保证了输出信息可以以追加的形式写入文件。
4.结果:
5.注意
以上调试结果信息在Debug模式下输出是没问题的,但是在Release模式下是默认不输出文件名、行号等信息,
这时只需要在.pro文件中加入以下宏定义:
DEFINES += QT_MESSAGELOGCONTEXT
之后,重新qmake编译既可以。