c++ - 实例化基于 Qt 文件的记录器以在 C++ 库中进行调试

标签 c++ debugging qt logging

下一页为 file based logging in Qt for debugging 提供了一个很好的简单解决方案无需使用像其他 SO 问题中建议的那样更大的日志记录框架。

我正在编写一个库,并希望实例化一个记录器,供库中的类使用(主要用于调试目的)。没有 int main()功能,因为它是一个图书馆。所以最好的方法是将实例化添加到文件中,如 logger.h并有任何类(class)包括logger.h如果它想做qDebug() << PREFIX << "Bla"正如上面的链接所暗示的那样?

最佳答案

我非常同意 OrcunC,但我建议使 ofstream 更易于访问并且能够处理 Qt 值类型。

这是我推荐的流程:

  1. 创建全局 QIODevice一切都将被写入的那个。这可能是一个 QFile。
  2. 创建 QTextStream QIODevice 的包装器,然后您将用于所有日志记录。
  3. 如果您想要稍微复杂一点的东西,请创建根据日志级别信息进行过滤的方法。

例如:

// 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/

相关文章:

c++ - 如何在 macOS 上的 Qt 中使用 OpenMP 进行编译?

c++ - 将 setText 和 setNum 合并到 Qt 中的标签中?

c++ - CMake 无法在新版本中识别 C++ 编译器版本

c++ - pdb 文件,检查磁盘空间不足、路径无效或权限不足

c++ - 适用于混合 Windows 应用程序的可嵌入单元测试框架

javascript - 在没有调试器的情况下进行调试

arrays - SWIFT OS X - 闭包语句内的多个语句,调试工具?

qt - onCheckedChanged 与 onCheckStateChanged

c++ - 开关盒中的多个条件?

c++ - 我可以从 C++17 折叠表达式中解析出单个函数吗