Создание файла-регистратора Qt для отладки в библиотеке C ++ - PullRequest
3 голосов
/ 06 июня 2011

На следующей странице представлено хорошее простое решение для ведения журнала на основе файлов в Qt для отладки без использования более масштабной структуры ведения журнала, как многие, которые предлагаются в других вопросах SO.Я пишу библиотеку и хотел бы создать журнал, который могут использовать классы в библиотеке (в основном для целей отладки).Нет функции int main(), так как это библиотека.Так что лучше всего было бы добавить экземпляр в файл, подобный logger.h, и иметь какие-либо классы, включающие logger.h, если он хотел бы сделать qDebug() << PREFIX << "Bla", как предлагает ссылка выше?

Ответы [ 3 ]

3 голосов
/ 06 июня 2011

Я в значительной степени согласен с 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
}

И тогда вы, скорее всего, создадите enum, представляющий LogLevel, и сделаете что-то вроде этого:

#include "qlogger.h"
//...
setCurrentLogLevel(LogLevel::Warning);
*qLog(LogLevel::Debug) << "this will be filtered" << yourQMap;
*qLog(LogLevel::Critical) << "not filtered" << yourQString;

Поскольку вы будете иметь дело с глобальными переменными, внимательно рассмотрите проблемы управления памятью.

2 голосов
/ 06 июня 2011

Если вы будете следовать методу, указанному в этой ссылке, сообщения ALL приложения, выведенные с помощью qCritical (), qDebug (), qFatal () и qWarning (), попадут в ваш обработчик.

Так что будьте осторожны!Вы можете получать не только сообщения трассировки вашей библиотеки, но и сообщения whole QT framework.Я думаю, это не то, что вы действительно хотите.

Вместо этого в качестве простого решения определите global * ofstream * в своей библиотеке и используйте его только в своей библиотеке.

1 голос
/ 06 июня 2011

всякий раз, когда вы пишете библиотеку на c ++ или c, рекомендуется объявить все ваши методы в файле .h и определить методы / классы в .cpp /.c файл.Это служит двум целям.

  1. Файл .h необходимо использовать для компиляции стороннего приложения, использующего вашу библиотеку, а сама библиотека используется во время ссылки.
  2. Разработчик, использующий вашу библиотеку, может использовать файл .h как ссылку на вашу библиотеку, поскольку он содержит все объявления.

Итак, да, вам нужно объявить методы в файле .h иесть другие классы включают logger.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...