qInstallMessageHandle安装消息,注册回调函数,对qDebug()、qWarning()、qCritial()、qInfo()、qFatal() 等函数输出信息重定向处理。
注明:以下方法仅适用于 Qt5 及以上版本。
目的:生成log.txt日志文件,记录详细日志信息(包括等级、所在文件、所在行号、描述信息、产生时间等),以便于快速跟踪、定位。那么在qt createor的应用程序输出窗口就不会有调试信息显示。
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
qInstallMessageHandler安装写在main()方法中,这样全局所有类的qDebug都可以将信息直接打印到日志文件中(即安装了消息处理)。如果想恢复消息处理程序,调用qInstallMessageHandler(0)。
QtMessageHandler 回调函数处理日志信息,包括等级、所在文件、所在行号、描述信息、产生时间。并保存到本地文件。
其中等级:
qDebug: 调试信息
qWarning:警告信息
qCritical: 严重错误
qFatal: 致命错误
#ifndef LOGGINGOUTPUT_H
#define LOGGINGOUTPUT_H#include <QObject>
#include <QApplication>
#include <QDir>
#include <QMutex>
#include <QDateTime>
#include <QTextStream>
#include <QFile>const int LOG_OPERATE_OK = 100; //操作成功
const int LOG_OPENFILE_FAILED = 101; //打开文件失败class QLogOutput : public QObject
{Q_OBJECT
public:explicit QLogOutput(QObject *parent = nullptr);//安装信息处理函数static void install(QString strLogFile);//卸载信息处理函数static void uninstall();private://日志信息处理函数static void outPutMsg(QtMsgType msgType, const QMessageLogContext &context, const QString &strText);//保存日志static int SaveLog(const QString &strMsg);//保存日志路径static QString m_strLogFile;};#endif // LOGGINGOUTPUT_H
#include "loggingoutput.h"QString QLogOutput::m_strLogFile = "";QLogOutput::QLogOutput(QObject *parent) : QObject(parent)
{}void QLogOutput::outPutMsg(QtMsgType msgType, const QMessageLogContext &context, const QString &strText)
{static QMutex mutex;mutex.lock();QByteArray localMsg = strText.toLocal8Bit();QString strMsg("");QString strMessage;// 设置输出信息格式QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");switch(msgType){case QtDebugMsg:{strMsg = QString("Debug:");strMessage = QString("[%1] %5 %6\t--File:%2 Line:%3 Function:%4 ").arg(strDateTime).arg(context.file).arg(context.line).arg(context.function).arg(strMsg).arg(strText);}break;case QtInfoMsg:{strMsg = QString("Info:");strMessage = QString("[%1] %2 %3\t").arg(strDateTime).arg(strMsg).arg(strText);}break;case QtWarningMsg:{strMsg = QString("Warning:");strMessage = QString("[%1] %5 %6\t--File:%2 Line:%3 Function:%4 ").arg(strDateTime).arg(context.file).arg(context.line).arg(context.function).arg(strMsg).arg(strText);}break;case QtCriticalMsg:{strMsg = QString("Critical:");strMessage = QString("[%1] %5 %6\t--File:%2 Line:%3 Function:%4 ").arg(strDateTime).arg(context.file).arg(context.line).arg(context.function).arg(strMsg).arg(strText);}break;case QtFatalMsg:{strMsg = QString("Fatal:");strMessage = QString("[%1] %5 %6\t--File:%2 Line:%3 Function:%4 ").arg(strDateTime).arg(context.file).arg(context.line).arg(context.function).arg(strMsg).arg(strText);}break;}SaveLog(strMessage);// 解锁mutex.unlock();}void QLogOutput::install(QString strLogFile)
{qInstallMessageHandler(outPutMsg);QString log_dir = strLogFile+"/log";QDir dir(log_dir);if(!dir.exists()){//创建在可执行程序所在目录创建log文件dir.mkdir(log_dir);}m_strLogFile = log_dir;
}void QLogOutput::uninstall()
{qInstallMessageHandler(0);
}int QLogOutput::SaveLog(const QString& strMsg)
{QString log_fileName;QDateTime current_date_time =QDateTime::currentDateTime();QString date = current_date_time.toString("yyyy-MM-dd");log_fileName = m_strLogFile +"/"+"log_"+date+".txt";// 输出信息至文件中(读写、追加形式)QFile file(log_fileName);bool bOpen = file.open(QIODevice::ReadWrite | QIODevice::Append);if(!bOpen)return LOG_OPENFILE_FAILED;QTextStream stream(&file);stream << strMsg << "\r\n";file.flush();file.close();return LOG_OPERATE_OK;
}
int main(int argc, char *argv[])
{QApplication a(argc, argv);QString strLogFile = QCoreApplication::applicationDirPath();QLogOutput::install(strLogFile);qDebug("This is a 调试 message.");qInfo("This is a info message.");Dialog w;w.show();return a.exec();
}
在vs2017 msvc + qt 的环境下,防止中文乱码,在pro文件配置
msvc{
QMAKE_CXXFLAGS += -utf-8
}