【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();
}

输出结果

相关推荐
潜创微科技--高清音视频芯片方案开发3 小时前
2026年C转DP芯片方案深度分析:从适配场景到成本性能的优选指南
c语言·开发语言
Thomas.Sir3 小时前
第三章:Python3 之 字符串
开发语言·python·字符串·string
刘景贤3 小时前
C/C++开发环境
开发语言·c++
Dxy12393102165 小时前
Python 根据列表中某字段排序:从基础到进阶
开发语言·windows·python
competes5 小时前
学生需求 交易累计积分,积分兑换奖品
java·大数据·开发语言·人工智能·java-ee
splage5 小时前
Java进阶——IO 流
java·开发语言·python
青桔柠薯片5 小时前
从C语言到裸机运行:i.MX6ULL 的 GPIO 控制与编译链接过程分析
c语言·开发语言·imx6ull
OasisPioneer5 小时前
现代 C++ 全栈教程 - Modern-CPP-Full-Stack-Tutorial
开发语言·c++·开源·github
weixin_537590455 小时前
《C程序设计语言》练习答案(练习1-13)
c语言·开发语言·c#