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

输出结果

相关推荐
Fcy6482 分钟前
C++ 模版(进阶)(含array解析)
开发语言·c++·stl·array·模版
OKkankan8 分钟前
多态概念及使用
开发语言·数据结构·c++·算法
hudawei9968 分钟前
kotlin协程编译成Android字节码后是什么样的
android·开发语言·kotlin
小周码代码19 分钟前
js 数字金额转为大写 js 金额转大写
开发语言·前端·javascript·js工具
行走在电子领域的工匠21 分钟前
台达ST:自定义串行通讯传送与接收指令COMRS程序范例五
开发语言·台达plc·st语言编程·串口自定义协议
BillKu30 分钟前
html2pdf.js使用与配置详解
开发语言·javascript·ecmascript
n***s90936 分钟前
ThinkPHP和PHP的区别
开发语言·php
code bean36 分钟前
【C++】全局函数和全局变量
开发语言·c++·c#
safestar201237 分钟前
Elasticsearch ILM实战:从数据热恋到冷静归档的自动化管理
java·开发语言·jvm·elasticsearch·es
霸王大陆40 分钟前
《零基础学 PHP:从入门到实战》教程-模块四:数组与函数-2
android·开发语言·php