下一页为 file based logging in Qt for debugging 提供了一个很好的简单解决方案无需使用像其他 SO 问题中建议的那样更大的日志记录框架。
我正在编写一个库,并希望实例化一个记录器,供库中的类使用(主要用于调试目的)。没有 int main()
功能,因为它是一个图书馆。所以最好的方法是将实例化添加到文件中,如 logger.h
并有任何类(class)包括logger.h
如果它想做qDebug() << PREFIX << "Bla"
正如上面的链接所暗示的那样?
最佳答案
我非常同意 OrcunC,但我建议使 ofstream
更易于访问并且能够处理 Qt 值类型。
这是我推荐的流程:
- 创建全局 QIODevice一切都将被写入的那个。这可能是一个 QFile。
- 创建 QTextStream QIODevice 的包装器,然后您将用于所有日志记录。
- 如果您想要稍微复杂一点的东西,请创建根据日志级别信息进行过滤的方法。
例如:
// setup the global logger somewhere appropriate
QFile *file = new QFile("your.log");
file->open(QIODevice::ReadOnly);
QTextStream *qlogger = new QTextStream(file);
一旦初始化了全局记录器,您就可以将其作为全局引用:
#include "qlogger.h"
//... and within some method
*qlogger << "your log" << aQtValueType;
但您可能需要一些过滤:
#include "qlogger.h"
// lower number = higher priority
void setCurrentLogLevel(int level) {
globalLogLevel = level;
}
QTextStream* qLog(int level) {
if (level <= globalLogLevel) {
return qlogger;
}
return getNullLogger(); // implementation left to reader
}
然后您可能会创建一个代表 LogLevel 的枚举并执行如下操作:
#include "qlogger.h"
//...
setCurrentLogLevel(LogLevel::Warning);
*qLog(LogLevel::Debug) << "this will be filtered" << yourQMap;
*qLog(LogLevel::Critical) << "not filtered" << yourQString;
在处理全局变量时,请仔细考虑内存管理问题。
关于c++ - 实例化基于 Qt 文件的记录器以在 C++ 库中进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6252468/