<QtLogging> - Qt Logging Types

<QtLogging> 头文件定义了 Qt 日志类型、函数和宏。更多

Header: #include <QtLogging>

类型

QtMessageHandler
enum QtMsgType { QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg }

功能

QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
void qSetMessagePattern(const QString &pattern)

qCritical(const char *message, ...)
qDebug(const char *message, ...)
qFatal(const char *message, ...)
qInfo(const char *message, ...)
qWarning(const char *message, ...)

详细说明

<QtLogging> 头文件包含多种日志类型、函数和宏。

QtMsgType 枚举标识了可生成并发送到 Qt 消息处理程序的各种消息;QtMessageHandler 是指向函数指针的类型定义,其签名为void myMessageHandler(QtMsgType, const QMessageLogContext &, const char *).qInstallMessageHandler() 函数可用于安装给定的QtMessageHandlerQMessageLogContext 类包含消息记录的行、文件和函数。该信息由QMessageLogger 类创建。

<QtLogging> 还包含从给定字符串参数生成消息的函数:qDebug(),qInfo(),qWarning(),qCritical(), 和qFatal().这些函数使用给定的消息调用消息处理程序。

示例

if(!driver()->isOpen()|||driver()->isOpenError()) {    qWarning("QSqlQuery::exec: database not open");
   return false; }

另请参见 QLoggingCategory

类型文档

QtMessageHandler

这是一个指向函数指针的类型定义,其签名如下:

void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);

另请参阅 QtMsgTypeqInstallMessageHandler()。

enum QtMsgType

该枚举描述了可发送至消息处理程序(QtMessageHandler )的消息。您可以使用该枚举来识别各种消息类型并将其与相应的操作关联起来。其值按严重程度递增的顺序排列:

常量说明
QtDebugMsg0qDebug() 函数生成的消息。
QtInfoMsg4qInfo() 函数生成的信息。
QtWarningMsg1qWarning() 函数生成的信息。
QtCriticalMsg2qCritical() 函数生成的信息。
QtFatalMsg3qFatal() 函数生成的信息。

另请参阅 QtMessageHandler,qInstallMessageHandler() 和QLoggingCategory

函数文档

QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)

type,context,str 参数中生成格式化字符串。

qFormatLogMessage 返回一个根据当前消息模式格式化的QString 。自定义消息处理程序可使用它来格式化与 Qt 默认消息处理程序类似的输出。

该函数是线程安全的。

另请参阅 qInstallMessageHandler() 和qSetMessagePattern()。

QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)

安装 Qt XML 消息handler 。返回指向先前安装的消息处理程序的指针。

消息处理程序是从 Qt 日志基础结构中打印出调试、信息、警告、关键和致命消息的函数。默认情况下,Qt 使用一个标准的消息处理程序,该程序会根据操作系统和 Qt 配置,格式化并打印消息到不同的汇。安装自己的消息处理程序可以完全控制,例如将消息记录到文件系统中。

请注意,Qt XML 支持logging categories ,用于将相关消息按语义类别分组。您可以使用它们来启用或禁用每个类别和message type 的日志记录。由于日志类别的过滤是在创建消息之前完成的,因此禁用类型和类别的消息将无法到达消息处理程序。

消息处理程序需要reentrant 。也就是说,它可能会被不同的线程并行调用。因此,向公共汇(如数据库或文件)的写入通常需要同步。

Qt XML 允许通过调用qSetMessagePattern() 或设置QT_MESSAGE_PATTERN 环境变量,用更多的元信息来丰富日志信息。要保持这种格式,自定义消息处理程序可以使用qFormatLogMessage() 。

尽量减少消息处理程序本身的代码,因为昂贵的操作可能会阻塞应用程序。此外,为避免递归,在消息处理程序中生成的任何日志信息都将被忽略。

消息处理程序应始终返回。对于fatal messages ,应用程序会在处理完该消息后立即终止。

整个应用程序一次只能安装一个消息处理程序。如果以前安装过自定义消息处理程序,函数将返回一个指向它的指针。以后可以通过再次调用该方法重新安装该处理程序。此外,调用qInstallMessageHandler(nullptr) 将恢复默认的消息处理程序。

下面是一个消息处理程序的示例,它在调用默认处理程序之前会将日志记录到本地文件:

#include <QApplication>
#include <stdio.h>
#include <stdlib.h>

QtMessageHandler originalHandler = nullptr;

void logToFile(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QString message = qFormatLogMessage(type, context, msg);
    static FILE *f = fopen("log.txt", "a");
    fprintf(f, "%s\n", qPrintable(message));
    fflush(f);

    if (originalHandler)
        *originalHandler(type, context, msg);
}

int main(int argc, char **argv)
{
    originalHandler = qInstallMessageHandler(logToFile);
    QApplication app(argc, argv);
    ...
    return app.exec();
}

请注意,C++ 标准保证以线程安全的方式初始化static FILE *f 。我们也可以预期fprintf()fflush() 是线程安全的,因此无需进一步同步。

另请参阅 QtMessageHandler,QtMsgType,qDebug(),qInfo(),qWarning(),qCritical(),qFatal(),调试技巧qFormatLogMessage() 。

void qSetMessagePattern(const QString &pattern)

更改默认消息处理程序的输出。

允许调整qDebug(),qInfo(),qWarning(),qCritical() 和qFatal() 的输出。qCDebug()、qCInfo()、qCWarning()和qCCritical() 的类别日志输出也会被格式化。

支持以下占位符:

占位符说明
%{appname}QCoreApplication::applicationName()
%{category}日志类别
%{file}源文件路径
%{function}功能
%{line}源文件中的行
%{message}实际信息
%{pid}QCoreApplication::applicationPid()
%{threadid}当前线程的全系统 ID(如果可以获取的话)
%{qthreadptr}指向当前QThread 的指针(QThread::currentThread() 的结果)
%{type}"调试"、"警告"、"严重 "或 "致命 "信息
%{time process}消息的时间,以进程启动后的秒数为单位(标记 "进程 "为字面意义)
%{time boot}信息时间,以系统启动后的秒为单位(如果可以确定)(标记 "boot "为字面形式)。如果无法获得启动时间,输出结果将是不确定的(参见QElapsedTimer::msecsSinceReference() )。
%{time [format]}信息发生时的系统时间,通过format 发送到QDateTime::toString() 进行格式化。如果未指定格式,则使用Qt::ISODate 的格式。
%{backtrace [depth=N] [separator="..."]}回溯,帧数由可选的depth 参数指定(默认为 5),并由可选的separator 参数分隔(默认为"|")。

此扩展仅在某些平台上可用:

  • 使用 glibc 的平台;
  • 使用 C++23 的平台<stacktrace> 头文件(要求在 C++23 模式下编译 Qt)。

根据平台的不同,该扩展打印的函数名也有一些限制。

在某些平台上,只知道导出函数的名称。如果您想查看应用程序中每个函数的名称,请确保您的应用程序是使用-rdynamic 或与之等效的版本编译和链接的。

读取回溯时,请注意由于内联或尾部调用优化,可能会丢失帧。

您还可以使用%{if-debug},%{if-info} %{if-warning} ,%{if-critical}%{if-fatal} 作为信息类型的条件,然后再加上%{endif} 。只有在类型匹配的情况下,才会打印%{if-*}%{endif} 中的内容。

最后,%{if-category}...%{endif} 中的文本只有在类别不是默认类别时才会打印。

举例说明:

    QT_MESSAGE_PATTERN="[%{time yyyyMMdd h:mm:ss.zzz ttt} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}"

默认的pattern%{if-category}%{category}: %{endif}%{message}

注意: 在 Android 系统中,默认的pattern%{message} ,因为 Android logcat 有专门的日志类别字段,所以类别被用作标签,请参阅Android 日志。如果使用包含类别的自定义pattern ,则会使用QCoreApplication::applicationName() 作为标签

pattern 也可以在运行时通过设置 QT_MESSAGE_PATTERN 环境变量来更改;如果同时调用了 qSetMessagePattern() 和设置了 QT_MESSAGE_PATTERN,则环境变量优先。

注意: 占位符categoryfilefunctionline 的信息只在调试生成时记录。也可以明确定义QT_MESSAGELOGCONTEXT 。更多信息请参阅QMessageLogContext 文档。

注意: 消息模式只适用于非结构化日志,如默认的stderr 输出。结构化日志(如 systemd)将按原样记录消息,并尽可能多地记录结构化信息。

自定义消息处理程序可以使用qFormatLogMessage() 将pattern 考虑在内。

另请参阅 qInstallMessageHandler()、调试技巧QLoggingCategoryQMessageLogContext

宏文档

qCritical(const char *message, ...)

调用包含关键信息message 的消息处理程序。如果未安装消息处理程序,则将消息打印到 stderr。在 Windows 环境下,消息将发送到调试器。在 QNX 系统中,消息将发送到 slogger2。

该函数接收格式字符串和参数列表,类似于 C 语言的 printf()函数。格式应为拉丁字母 1 字符串。

举例说明

void load(const QString &fileName)
{
    QFile file(fileName);
    if (!file.exists())
        qCritical("File '%s' does not exist!", qUtf8Printable(fileName));
}

如果包含 <QtDebug>,还可以使用更方便的语法:

qCritical() << "Brush:" << myQBrush << "Other value:" << i;

在项目之间插入空格,并在末尾添加换行符。

要在运行时抑制输出,可以定义logging rules 或注册一个自定义的filter

出于调试目的,有时让程序终止处理关键信息也很方便。这样就可以检查核心转储,或附加调试器--另请参阅qFatal() 。要启用此功能,可将环境变量QT_FATAL_CRITICALS 设为n 。这样,程序就会在出现第 n 条关键信息时终止。也就是说,如果环境变量设置为 1,程序将在第一次调用时终止;如果环境变量的值为 10,程序将在第 10 次调用时退出。环境变量中的任何非数值都等同于 1。

注意:该宏是线程安全的

另请参阅 qCCritical(),qDebug(),qInfo(),qWarning(),qFatal(),qInstallMessageHandler() 和调试技巧

qDebug(const char *message, ...)

调用带有调试信息message 的消息处理程序。如果没有安装消息处理程序,则会将消息打印到 stderr。在 Windows 下,如果是控制台应用程序,消息将被发送到控制台;否则,消息将被发送到调试器。在 QNX 系统中,信息将发送到 slogger2。如果在编译过程中定义了QT_NO_DEBUG_OUTPUT ,则该函数不会执行任何操作。

如果向该函数传递格式字符串和参数列表,其工作方式与 C 的 printf() 函数类似。格式应为拉丁字母 1 的字符串。

例如

qDebug("Items in list: %d", myList.size());

如果包含<QtDebug> ,还可以使用更方便的语法:

qDebug() << "Brush:" << myQBrush << "Other value:" << i;

使用这种语法,函数将返回一个QDebug 对象,该对象已配置为使用QtDebugMsg 消息类型。它会自动在每个项目之间加上一个空格,并在结尾输出换行符。它支持许多 C++ 和 Qt 类型。

要在运行时抑制输出,可使用qInstallMessageHandler() 安装自己的消息处理程序。

注意:该宏是线程安全的

另请参阅 qCDebug(),qInfo(),qWarning(),qCritical(),qFatal(),qInstallMessageHandler() 和调试技巧

qFatal(const char *message, ...)

调用带有致命消息message 的消息处理程序。如果未安装消息处理程序,则将消息打印到 stderr。在 Windows 环境下,该信息会发送到调试器。在 QNX 系统中,消息将发送到 slogger2。

如果使用的是默认消息处理程序,该函数将终止以创建核心转储。在 Windows 系统中,对于调试程序,该函数将报告 _CRT_ERROR,以便将调试器连接到应用程序。

该函数接收格式字符串和参数列表,类似于 C 语言的 printf() 函数。

示例

int divide(int a, int b)
{
    if (b == 0)                                // program error
        qFatal("divide: cannot divide by zero");
    return a / b;
}

要在运行时抑制输出,请使用qInstallMessageHandler() 安装自己的消息处理程序。

另请参阅 qCFatal(),qDebug(),qInfo(),qWarning(),qCritical(),qInstallMessageHandler() 和调试技巧

qInfo(const char *message, ...)

调用带有信息消息message 的消息处理程序。如果没有安装消息处理程序,则会将消息打印到 stderr。在 Windows 下,如果是控制台应用程序,消息会发送到控制台;否则,会发送到调试器。在 QNX 系统中,信息将发送到 slogger2。如果在编译过程中定义了QT_NO_INFO_OUTPUT ,则该函数不会执行任何操作。

如果向该函数传递格式字符串和参数列表,其工作方式与 C 的 printf() 函数类似。格式应为拉丁字母 1 的字符串。

例如

qInfo("Items in list: %d", myList.size());

如果包含<QtDebug> ,还可以使用更方便的语法:

qInfo() << "Brush:" << myQBrush << "Other value:" << i;

使用这种语法,函数将返回一个QDebug 对象,该对象已配置为使用QtInfoMsg 消息类型。它会自动在每个项目之间加上一个空格,并在结尾输出换行符。它支持许多 C++ 和 Qt 类型。

要在运行时抑制输出,可使用qInstallMessageHandler() 安装自己的消息处理程序。

注意:该宏是线程安全的

另请参阅 qCInfo(),qDebug(),qWarning(),qCritical(),qFatal(),qInstallMessageHandler() 和调试技巧

qWarning(const char *message, ...)

调用带有警告信息的消息处理程序message 。如果未安装消息处理程序,则会将消息打印到 stderr。在 Windows 环境下,消息会发送到调试器。在 QNX 系统中,消息将发送到 slogger2。

该函数接收格式字符串和参数列表,类似于 C 语言的 printf()函数。格式应为拉丁字母 1 字符串。

举例说明

void f(int c)
{
    if (c > 200)
        qWarning("f: bad argument, c == %d", c);
}

如果包含 <QtDebug>,还可以使用更方便的语法:

qWarning() << "Brush:" << myQBrush << "Other value:" << i;

该语法在每个项目之间插入一个空格,并在末尾添加一个换行符。

如果在编译过程中定义了QT_NO_WARNING_OUTPUT ,则此函数不起任何作用。要在运行时抑制输出,可以设置logging rules 或注册一个自定义的filter

出于调试目的,有时让程序终止运行以获取警告信息也很方便。这样就可以检查核心转储,或附加调试器--另请参阅qFatal() 。要启用此功能,可将环境变量QT_FATAL_WARNINGS 设为一个数字n 。这样,程序就会在出现第 n 次警告时终止。也就是说,如果环境变量设置为 1,程序将在第一次调用时终止;如果环境变量的值为 10,程序将在第 10 次调用时退出。环境变量中的任何非数值都等同于 1。

注意:该宏是线程安全的

另请参阅 qCWarning(),qDebug(),qInfo(),qCritical(),qFatal(),qInstallMessageHandler() 和调试技巧

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.