Qt日志信息处理
- 一、介绍
- 二、相关函数的使用介绍
-
- [1. qInstallMessageHandle](#1. qInstallMessageHandle)
- [2. QtMsgType](#2. QtMsgType)
- [3. QMessageLogContext](#3. QMessageLogContext)
- 三、一个简单示例
一、介绍
Qt有Info、Debug、Warning、Critical、Fatal
五种级别的调试信息。
Info
: 提示信息qDebug
:调试信息qWarning
:警告信息qCritical
:严重错误qFatal
:致命错误
Qt4提供了qInstallMsgHandler
,Qt5提供了qInstallMessageHandler
,对qInfo 、qDebug、qWarning、qCritical、qFatal等函数输出信息的重定向处理。,这里我们主要介绍Qt5提供的qInstallMessageHandler
qInstallMsgHandler
是一个回调函数,由qInfo 、qDebug、qWarnng、qCritical、qFatal 宏进行触发,这些函数处理的消息文本会被qInstallMsgHandler
所指向的回调函数截获,允许用户自己来处理输出的消息文本。
二、相关函数的使用介绍
1. qInstallMessageHandle
该函数就是:安装自定义消息处理器函数
其中QtMessageHandler
是一个指向具有以下函数签名的的 typedef
:
其中这里的最后一个参数就是我么要输出的日志内容,即qDebug() <<
后面的字符串。
2. QtMsgType
其中QtMsgType
是一个枚举类,Info、Debug、Warning、Critical、Fatal
等宏会将自己的日志类型按照下面的值进行传递给QtMessageHandler
中的QtMsgType
参数。
3. QMessageLogContext
该类提供有关生成 qDebug
、qInfo
、qWarning
、qCritical
或 qFatal
消息的源代码位置,文件位置,函数位置的信息。
注意 : 默认情况下,
QMessageLogContext
中的信息仅记录在Debug版本中存在,在Release版本中这些字段是空值,为了输出它们,需要在 .pro 文件里加入下面的定义:
DEFINES += QT_MESSAGELOGCONTEXT
三、一个简单示例
下面是一个简单的示例,演示如何自定义日志的格式:
cpp
#include "mainwidget.h"
#include <QApplication>
#include <QLocale>
#include <QTranslator>
#include <QRegularExpression>
#include <QDebug>
#include <QMutex>
#include <QMutexLocker>
#include <QDir>
// 清理函数名称
QString cleanFunctionName(QString& functionName)
{
return functionName.remove("__cdecl ");
}
// 自定义消息处理器函数
void customMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& payload)
{
// 加锁,防止多线程并发打印日志出现错乱
static QMutex mutex;
QMutexLocker<QMutex> locker(&mutex);
// 得到日志等级
QString level;
switch (type)
{
case QtDebugMsg:
level += "Debug";
break;
case QtWarningMsg:
level += "Warning";
break;
case QtCriticalMsg:
level += "Critical";
break;
case QtFatalMsg:
level += "Fatal";
break;
case QtInfoMsg:
level += "Info";
break;
default:
level += "Unknown";
break;
}
// 获取纯文件名
QString fileName = context.file;
qsizetype index = fileName.lastIndexOf(QDir::separator());
fileName = fileName.sliced(index + 1);
// 获取当前时间
QString currentDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
// 获取纯函数名,去除调用约定,例如__cdecl
QString functionName = context.function;
cleanFunctionName(functionName);
// 组织一条完整的日志
QString log = QString("[%1] [%2] (%3:%4, %5) %6\n")
.arg(currentDateTime, level, fileName,
QString::number(context.line), functionName, payload);
// 将日志输出到控制台
QTextStream(stdout) << log;
}
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
qDebug() << "这是第一条未经设置过的测试日志";
// 安装自定义消息处理器函数
qInstallMessageHandler(customMessageHandler);
MainWidget w;
// 进行日志测试
w.show();
qInfo() << "这是一条Info测试日志";
qDebug() << "这是一条Debug测试日志";
qWarning() << "这是一条Warning测试日志";
qCritical() << "这是一条Critical测试日志";
return a.exec();
}
输出结果