本文介绍Qt应用程序输出日志的方法。
Qt应用程序发布后,应用程序有时会出现一些问题,程序运行过程中的信息记录显得尤为重要,这就要求应用程序可以输出日志,通过日志方便我们分析,解决问题。
Qt对日志的输出提供了较好的支持,下面介绍如何在Qt应用程序中输出日志。
1.输出重定向
Qt的qDebug(),qCritical(),qWarning()默认输出是输出到控制台的,也就是我们的调试输出。要想输出到日志文件,就需要对输出重定向,Qt提供了一个回调函数,方便用户按自己的输出格式输出日志。
1)建立"log.h"
#ifndef LOG_H
#define LOG_H
#include <QCoreApplication>
#include <QString>
#define LOG_FILE ("log.txt")
#define LOG_FILE_SIZE (10*1024*1024)
void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg);
#endif // LOG_H
2)建立"log.cpp"
#include "log.h"
#include <QMutex>
#include <QString>
#include <QFile>
#include <QDateTime>
#include <QTextStream>
static QMutex mutex;
void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QString text;
QString time;
QFile file(LOG_FILE);
Q_UNUSED(context)
mutex.lock();
if (file.size() > LOG_FILE_SIZE) {
file.open(QIODevice::WriteOnly);
} else {
file.open(QIODevice::WriteOnly | QIODevice::Append);
}
QTextStream textStream(&file);
switch(type) {
case (QtDebugMsg): {text = QString("Debug:"); break;}
case (QtWarningMsg): {text = QString("Warning:"); break;}
case (QtCriticalMsg): {text = QString("Critical:"); break;}
case (QtFatalMsg): {text = QString("Fatal:"); break;}
default: {break;}
}
time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
text = QString("%1%2 %3").arg(text).arg(time).arg(msg);
textStream << text << "\r\n";
file.flush();
file.close();
mutex.unlock();
}
这里我们定义了1个外部函数,函数内容比较简单,就不细介绍了。
2.安装
定义好用户的消息处理函数后,需要注册到系统中,在"main.cpp"中:
#define APP_DEBUG
int main(int argc, char *argv[])
{
#ifdef APP_DEBUG
qInstallMessageHandler(nullptr);
#else
qInstallMessageHandler(messageHandler);
#endif
QApplication a(argc, argv);
MainWindow w;
w.show();
qDebug() << "debug";
qCritical() << "critical";
qWarning() << "warning";
return a.exec();
}
采用qInstallMessageHandler()函数将我们定义的消息处理函数安装进系统,输出就可以到日志文件了。
另外,这里定义了宏"APP_DEBUG",在代码开发过程中定义,可使输出信息到控制台,程序发布时可取消定义,日志输出到日志文件中。
总结,本文介绍了Qt应用程序输出日志的方法。