<QtLogging> - Qt 日志类型
<QtLogging> 头文件定义了 Qt 日志类型、函数和宏。 更多信息...
头文件 | #include <QtLogging> |
类型
QtMessageHandler | |
枚举 | 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() 函数安装给定的 QtMessageHandler 。QMessageLogContext 类包含消息被记录时的行、文件和函数信息。这些信息由 QMessageLogger 类创建。
<QtLogging> 还包含从给定字符串参数生成消息的函数: qDebug(),qInfo(),qWarning(),qCritical() 和 qFatal()。这些函数将给定的消息调用消息处理器。
例子
if (!driver()->isOpen() || driver()->isOpenError()) { qWarning("QSqlQuery::exec: database not open"); return false; }
类型文档
QtMessageHandler
这是一个指向具有以下签名的函数的指针的类型定义
void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);
另请参阅 QtMsgType 和 qInstallMessageHandler。
枚举 QtMsgType
此枚举描述了可以向消息处理器发送的消息(QtMessageHandler)。您可以使用枚举来识别和将各种消息类型与相应的操作关联起来。其值按照严重程度递增的顺序排列:
函数文档
QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)
使用type、context和str参数生成格式化的字符串。
qFormatLogMessage返回一个按当前消息模式格式化的QString。它可用于自定义消息处理器来格式化输出,类似于Qt默认消息处理器的输出。
此函数是线程安全的。
另请参阅 qInstallMessageHandler() 和 qSetMessagePattern()。
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
安装Qt消息处理器handler。返回先前安装的消息处理器指针。
消息处理器是一个函数,它从Qt的日志基础设施中打印出调试、信息、警告、关键和致命信息。默认情况下,Qt使用标准消息处理器,该处理器根据操作系统和Qt配置将该格式和打印的信息发送到不同的接收器。安装您自己的消息处理器可以完全控制,并将日志消息记录到文件系统中。
请注意,Qt支持日志类别,用于在语义类别中对相关消息进行分组。您可以使用这些类别来根据类别和消息类型启用或禁用日志记录。由于日志类别过滤器是在消息创建之前执行的,因此被禁用的类型和类别的消息将不会到达消息处理器。
消息处理器需要是可重入的。也就是说,它可能从不同的线程并行调用。因此,写入共享接收器(如数据库或文件)通常需要进行同步。
Qt允许通过调用qSetMessagePattern()或设置环境变量QT_MESSAGE_PATTERN
来进一步丰富日志消息的元信息。为了保持这种格式,自定义消息处理器可以使用qFormatLogMessage。
尽量保持消息处理器本身的代码量最少,因为昂贵的操作可能会阻塞应用程序。另外,为了避免递归,消息处理器中生成的任何日志消息都将被忽略。
消息处理器应始终返回。对于致命消息,应用程序在处理该消息后立即终止。
同一时间只能安装一个消息处理器,用于整个应用程序。如果已安装了之前自定义的消息处理器,函数将返回对其的指针。然后,可以通过对该方法的另一调用重新安装该处理器。此外,调用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()、调试技术和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} | "debug"、"warning"、"critical"或"fatal"} |
%{time process} | 消息的时间,自进程启动以来的秒数(令牌"process"是字面意思) |
%{time boot} | 消息时间,自系统启动以来的秒数(如果可以确定,则选定的令牌"boot"是字面意思)。如果无法获取自启动时间,输出是不确定的(请参阅QElapsedTimer::msecsSinceReference()())。 |
%{time [format]} | 消息发生时的系统时间,通过传递format 到QDateTime::toString()格式化。如果未指定格式,则使用Qt::ISODate的格式。 |
%{backtrace [depth=N] [separator="..."]} | 具有由可选depth 参数指定的帧数(默认为5)的回溯,并由可选separator 参数(默认为"|")分隔。此扩展仅在某些平台上可用(目前仅限于使用glibc的平台)。已知只有导出函数的名称。如果您想看到应用程序中每个函数的名称,请确保您的应用程序已用 在读取回溯时,请考虑框可能因内联或尾调用优化而缺失。 |
您还可以使用消息类型的条件语句,例如使用%{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 t} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}"
默认的模式是%{if-category}%{category}: %{endif}%{message}
。
可以在运行时通过设置QT_MESSAGE_PATTERN环境变量来更改模式;如果同时调用了qSetMessagePattern()和设置了QT_MESSAGE_PATTERN,则环境变量具有优先权。
注意:对于占位符类别
、文件
、函数
和行
的信息,仅在调试构建中记录。或者,可以显式定义QT_MESSAGELOGCONTEXT
。有关更多信息,请参阅QMessageLogContext文档。
注意:消息模式仅适用于非结构化日志,如默认的stderr
输出。结构化日志(如systemd)会记录消息原样,并尽可能记录结构化信息。
自定义消息处理器可以使用qFormatLogMessage()考虑模式。
参见qInstallMessageHandler()、调试技术、QLoggingCategory和QMessageLogContext。
宏文档
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;
项目之间插入空格,并在末尾追加换行符。
要抑制运行时的输出,可以定义日志规则或注册自定义的过滤器。
对于调试目的,有时需要让程序在严重消息时终止,这样就可以检查核心转储或附加调试器 - 请参阅qFatal。要启用此功能,将环境变量QT_FATAL_CRITICALS
设置为数字n
。程序将在第n次严重消息时终止。也就是说,如果环境变量设置为1,则第一次调用时终止;如果包含值为10,则在第十次调用时退出。环境变量中的任何非数值值都相当于1。
注意:此宏是线程安全的。
参见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()安装您自己的消息处理程序。
注意:此宏是线程安全的。
另请参阅 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()安装您自己的消息处理程序。
另请参阅 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;
使用这种语法,函数将返回一个配置为使用QtInfoMsg消息类型的QDebug对象。它自动在每个条目之间放置一个空格,并在末尾输出换行符。它支持许多C++和Qt类型。
要在运行时抑制输出,请使用qInstallMessageHandler()安装您自己的消息处理程序。
注意:此宏是线程安全的。
另请参阅 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
,则此函数不执行任何操作。要在运行时抑制输出,您可以设置 记录规则 或注册自定义 过滤器。
出于调试目的,有时出于方便,程序会终止警告消息。这允许您检查核心转储或附加调试器 - 参见 qFatal。为了启用此功能,将环境变量 QT_FATAL_WARNINGS
设置为数字 n
。然后程序会在第 n 次警告时终止。也就是说,如果环境变量设置为 1,则在第一次调用时终止;如果包含值 10,则在第十次调用时退出。环境变量中的任何非数字值都与 1 等效。
注意:此宏是线程安全的。
另请参阅 qDebug()、qInfo()、qCritical()、qFatal()、qInstallMessageHandler() 以及 调试技巧。
© 2024 Qt 公司。包含在此处的文档贡献是各自所有者的版权。此处提供的文档根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款进行许可。Qt以及相应的徽标是芬兰和/或世界其他国家的 Qt 公司的商标。所有其他商标均为其相应所有者的财产。