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

输出结果

相关推荐
R1nG8638 分钟前
多线程安全设计 CANN Runtime关键数据结构的锁优化
开发语言·cann
初次见面我叫泰隆9 分钟前
Qt——5、Qt系统相关
开发语言·qt·客户端开发
亓才孓14 分钟前
[Class的应用]获取类的信息
java·开发语言
开开心心就好22 分钟前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
Never_Satisfied26 分钟前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
3GPP仿真实验室1 小时前
【Matlab源码】6G候选波形:OFDM-IM 增强仿真平台 DM、CI
开发语言·matlab·ci/cd
devmoon1 小时前
在 Polkadot 上部署独立区块链Paseo 测试网实战部署指南
开发语言·安全·区块链·polkadot·erc-20·测试网·独立链
lili-felicity1 小时前
CANN流水线并行推理与资源调度优化
开发语言·人工智能
沐知全栈开发1 小时前
CSS3 边框:全面解析与实战技巧
开发语言
island13141 小时前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构 Stream 调度机制
c语言·开发语言·神经网络