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

时间:2011-06-06 13:08:16

标签: c++ debugging qt logging

以下页面为file based logging in Qt for debugging提供了一个很好的简单解决方案,而不使用像其他SO问题中建议的更多的日志框架。

我正在编写一个库,并希望实例化一个库中的类可以使用的记录器(主要用于调试目的)。没有int main()函数,因为它是一个库。那么最好的方法是将实例化添加到logger.h这样的文件中,并且如果要按照上面的链接建议logger.h,那么任何类都包含qDebug() << PREFIX << "Bla"吗?

3 个答案:

答案 0 :(得分:3)

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

这是我推荐的流程:

  1. 创建一个全局QIODevice,将写入所有内容。这可能是QFile。
  2. 围绕该QIODevice创建一个QTextStream包装器,然后将其用于所有日志记录。
  3. 如果您想要稍微复杂一点的东西,请创建基于日志级别信息进行过滤的方法。
  4. 例如:

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

    当您处理全局变量时,请仔细考虑内存管理问题。

答案 1 :(得分:2)

如果您按照该链接中的方法,使用qCritical(),qDebug(),qFatal()和qWarning()的应用程序输出的所有消息将流入您的处理程序。

所以要小心!您不仅可以获得图书馆的跟踪消息,还可以获得整个 QT框架的消息。我想这不是你真正想要的。

而不是这个 作为一个简单的解决方案,在您的库中定义全局 * ofstream *,并仅在您的库中使用它。

答案 2 :(得分:1)

无论何时用c ++或c编写库,最好在.h文件中声明所有方法,然后定义中的方法/类。 cpp / .c文件。这有两个目的。

  1. .h文件需要用于编译使用您的库的第三方应用程序,并且库本身在链接时使用。
  2. 使用您的库的开发人员可以使用.h文件作为对库的引用,因为它包含所有声明。
  3. 所以,是的,您需要在.h文件中声明方法,并让其他类包含logger.h