将通过qDebug、qWarning等输出的信息保存到日志文件中
假如想将qDebug、qWarning等输出的信息既在控制台(或/且在QtCreator的应用输出中)中显示,又可以将输出保存到日志文件中,可以利用qInstallMessageHandler
这个函数。
下面的代码实现了上述的功能,同时还可以让在控制台的输出带颜色。
关于颜色,可以参考这个的说明:
【使用ANSI转义序列设置终端文本颜色】
#include <QApplication>
#include <QFile>
#include <QDebug>
#include <QMutex>
#include <QMutexLocker>
#include <QDateTime>
#include <stdio.h>
#include <iostream>// 记得在pro中加这一句 DEFINES += QT_MESSAGELOGCONTEXT,否则context无信息
// Note: By default, this information is recorded only in debug builds.
// You can overwrite this explicitly by defining QT_MESSAGELOGCONTEXT or QT_NO_MESSAGELOGCONTEXT.
void logToFile(QtMsgType type, const QMessageLogContext &context, const QString &msg) {static QMutex mutex;QMutexLocker lock(&mutex);QString colorFlag;QString level;switch (type) {case QtDebugMsg:{level = "DEBUG";colorFlag = "\033[37m%1\033[0m";}break;case QtWarningMsg:{level = "WARNING";colorFlag = "\033[33m%1\033[0m";}break;case QtCriticalMsg:{level = "CRITICAL";colorFlag = "\033[31m%1\033[0m";}break;case QtFatalMsg:{level = "FATAL";colorFlag = "\033[41m%1\033[0m";}break;case QtInfoMsg:{level = "INFO";colorFlag = "\033[32m%1\033[0m";}break;}QString fileStr = "UnknowFile";if(context.file != nullptr){fileStr = context.file;}int lineNum = context.line;QString finalMsg = QString("[%1][%2][%3][%4] %5").arg(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")).arg(level).arg(fileStr).arg(lineNum).arg(msg);// 是否保存到文件if(1){QFile file("app.log");if (!file.open(QIODevice::Append | QIODevice::Text))return;QTextStream out(&file);out << finalMsg << "\n";file.close();}std::cout<< colorFlag.arg(finalMsg).toLocal8Bit().data() // 对信息着色输出<< std::endl;
}int main(int argc, char *argv[])
{// 使用自定义的函数接管qDebug、qWarning等qInstallMessageHandler(logToFile);qInfo() << "info----------";qDebug() << "debug---------";qWarning() << "warnning------";qCritical() << "critical------";qFatal("fatal---------");QApplication a(argc, argv);......return a.exec();
}