文章目录
QLoggingCategory 是 Qt 框架中用于管理日志分类的模块,它允许开发者对日志进行精细化分类和控制。
1. 基本概念
- 分类日志:将日志按模块、功能或自定义类别划分,例如网络、数据库、UI 等。
- 日志级别:支持
DEBUG
、INFO
、WARNING
、CRITICAL
等级别。 - 动态控制:可在运行时通过环境变量或代码开启/关闭特定分类的日志。
2. 声明日志分类
在头文件中声明日志分类(需在全局作用域):
#include <QLoggingCategory>
// 声明日志分类(通常放在头文件)
Q_DECLARE_LOGGING_CATEGORY(myNetworkCategory)
Q_DECLARE_LOGGING_CATEGORY(myDatabaseCategory)
在源文件中定义:
// 定义日志分类(通常放在实现文件)
Q_LOGGING_CATEGORY(myNetworkCategory, "network")
Q_LOGGING_CATEGORY(myDatabaseCategory, "database")
3. 输出分类日志
使用分类日志宏替代 qDebug()
等通用宏:
// 输出网络模块的调试日志
qCDebug(myNetworkCategory) << "Connecting to server..." << url;
// 输出数据库模块的警告日志
qCWarning(myDatabaseCategory) << "Database connection lost!";
4. 控制日志输出
方式 1:环境变量
通过 QT_LOGGING_RULES
环境变量控制:
# 开启 network 分类的 debug 日志,关闭 database 的警告日志
export QT_LOGGING_RULES="network.debug=true;database.warning=false"
方式 2:代码控制
// 启用某个分类的日志级别
QLoggingCategory::setFilterRules("network.debug=true");
// 直接操作分类对象
QLoggingCategory::category("network")->setEnabled(QtDebugMsg, true);
5. 日志规则语法
- 通配符:
*
匹配任意字符,?
匹配单个字符。 - 示例规则:
*.debug=false # 关闭所有 debug 日志 network.*=true # 开启 network 分类的所有级别 database.warning=true
6. 自定义日志处理
重定向日志到文件或自定义格式:
void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
QByteArray localMsg = msg.toLocal8Bit();
const char* category = context.category; // 获取日志分类名称
// 示例:将日志写入文件
QFile file("app.log");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream stream(&file);
stream << "[" << category << "] " << localMsg << "\n";
}
// 在 main() 中安装处理器
qInstallMessageHandler(customMessageHandler);
7. 常见问题
- 日志未输出:检查分类名称拼写、环境变量是否生效。
- 性能优化:生产环境中关闭不必要的日志级别。
- 作用域:日志分类对象应全局唯一,避免重复定义。
参考 Qt 官方文档。