【Qt】Qt日志信息处理

Qt日志信息处理

一、介绍

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

该类提供有关生成 qDebugqInfoqWarningqCriticalqFatal消息的源代码位置,文件位置,函数位置的信息。

注意 : 默认情况下,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();
}

输出结果

相关推荐
艾莉丝努力练剑38 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
还债大湿兄2 小时前
《C++内存泄漏8大战场:Qt/MFC实战详解 + 面试高频陷阱破解》
c++·qt·mfc
倔强青铜35 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
u_topian5 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
珊瑚里的鱼6 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上6 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
xingshanchang6 小时前
Matlab的命令行窗口内容的记录-利用diary记录日志/保存命令窗口输出
开发语言·matlab
Risehuxyc6 小时前
C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
开发语言·c++
AI视觉网奇6 小时前
git 访问 github
运维·开发语言·docker
不知道叫什么呀6 小时前
【C】vector和array的区别
java·c语言·开发语言·aigc