以下页面为file based logging in Qt for debugging提供了一个很好的简单解决方案,而不使用像其他SO问题中建议的更多的日志框架。
我正在编写一个库,并希望实例化一个库中的类可以使用的记录器(主要用于调试目的)。没有int main()
函数,因为它是一个库。那么最好的方法是将实例化添加到logger.h
这样的文件中,并且如果要按照上面的链接建议logger.h
,那么任何类都包含qDebug() << PREFIX << "Bla"
吗?
答案 0 :(得分:3)
我非常同意OrcunC,但我建议让ofstream
更易于访问并且能够处理Qt值类型。
这是我推荐的流程:
例如:
// 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文件。这有两个目的。
所以,是的,您需要在.h文件中声明方法,并让其他类包含logger.h
。