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

输出结果

相关推荐
明月看潮生20 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
南宫理的日知录31 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
逊嘘1 小时前
【Java语言】抽象类与接口
java·开发语言·jvm
Half-up1 小时前
C语言心型代码解析
c语言·开发语言
Source.Liu1 小时前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word
小白学大数据1 小时前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin