Russian Qt Forum

Qt => Общие вопросы => Тема начата: forallstuff от Март 31, 2011, 10:42



Название: Класс или компонент для логгирования работы программы.
Отправлено: forallstuff от Март 31, 2011, 10:42
Здравствуйте. В процессе работы столкнулся с потребностью вести журнал работы ПО, раньше использовали cout, qDebug, иногда модуль логгироваиня компонента qtservice, но сейчас все это не подходит.


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: Sahab от Март 31, 2011, 10:57
как вариант:
http://libqxt.bitbucket.org/doc/tip/tech-log.html (http://libqxt.bitbucket.org/doc/tip/tech-log.html)

а чем qDebug не устроил?


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: asvil от Март 31, 2011, 11:59
И тут появляюсь я с пропагандой log4qt. Итак уважаемый слушатель. log4qt это порт на Qt знаменитой библиотеки для Java. Он позволяет Вам:

  # Вести журнал одновременно
  ## в консоль (stdout, stderr, (win* debugoutput)), с цветами как cmake.
  ## в сеть (telnet server, который раздает лог направо и налево)
  ## вообще в любой QIODevice
  ## в объект, у которого сигнал срабатывает.
  # Формировать сообщения в соответсвии с тем, как ваша душа пожелает.
  # Вести несколько журналов в разные места. Журналы идентифицируются строковым именем.
  # Перенаправить qDebug в журнал "Qt".

И еще много внутренних финтифлюшек для того, чтобы Ваша многопоточная программа ни за что не упала, даже если количество Ваших потоков составит максимальное допустимое количество для операционной системы и они все одновременно попадут в дедлок и будут слать сообщение в один журнал о том, что не получается захватить ресурс, так как этот ресурс захвачен другим соседом.

https://gitorious.org/log4qt


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: vunder от Март 31, 2011, 15:07
В своем проекте я сам реализовывал журнал событий. Нужно было сделать это быстро и просто. Реализовал через фильтр событий.
В файле messageevent.h объявил 3 метода для отправки сообщения. Сами сообщения отправляются через QCoreApplication::postEvent(), поэтому нет проблем с многопоточность.
Механизм нормально работает и с плагинами.


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: forallstuff от Март 31, 2011, 15:18
да и я сам писал, было дело, но хотелось чего-нибудь широкого и универсального, на вскидку наткнулся на log4cpp, но увидев отсутствие документации сразу плюнул. Пока остановился на qxtlib, компилирую, скоро буду тестировать.


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: kolob от Май 21, 2011, 22:40
А я вот так реализовал ведение лог файла:
Код:
void myMessageOutput(QtMsgType type, const char *msg)
{
FILE *file;
file = fopen("logfile.log", "a");
switch(type)
{
        case QtDebugMsg:
fprintf(file, "[%s %s] #DEBUG: %s\n", QDate::currentDate().toString(Qt::ISODate).ascii(), QTime::currentTime().toString(Qt::ISODate).ascii(), msg);
            break;
        case QtWarningMsg:
            fprintf(file, "[%s %s] #WARNING: %s\n", QDate::currentDate().toString(Qt::ISODate).ascii(), QTime::currentTime().toString(Qt::ISODate).ascii(), msg);
            break;
        case QtFatalMsg:
            fprintf(file, "[%s %s] #FATAL: %s\n", QDate::currentDate().toString(Qt::ISODate).ascii(), QTime::currentTime().toString(Qt::ISODate).ascii(), msg);
            abort();                   
    }
fclose(file);
}
Вроде нормально.

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

 Ну и какое твое мнение об qxtlib?


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: Пантер от Май 23, 2011, 07:39
kolob, нехорошее решение - у тебя на каждое сообщение открывается файл.


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: SASA от Май 23, 2011, 09:49
http://habrahabr.ru/blogs/cpp/118165/ (http://habrahabr.ru/blogs/cpp/118165/)


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: Пантер от Май 23, 2011, 09:59
Когда-то нужно было по быстренькому прикрутить логирование, вот так получилось:
Код
C++ (Qt)
const QString appName = "SomeProg";
 
const size_t maxLogFileSize = 1 * 1024 * 1024; //1 MB
 
class LogFile
{
public:
explicit LogFile (QtMsgType type) : type_ (type) {
 
messages_ [QtDebugMsg] = "Debug";
messages_ [QtWarningMsg] = "Warning";
messages_ [QtCriticalMsg] = "Critical";
messages_ [QtFatalMsg] = "Fatal";
 
fileNames_ [QtDebugMsg] = appName + "_debug.log";
fileNames_ [QtWarningMsg] = appName + "_warning.log";
fileNames_ [QtCriticalMsg] = appName + "_critical.log";
fileNames_ [QtFatalMsg] = appName + "_fatal.log";
 
file_.setFileName (QCoreApplication::applicationDirPath ()
  + "/"
  + fileNames_ [type_]);
QIODevice::OpenMode openMode = QIODevice::WriteOnly;
 
if (file_.exists () && file_.size () < maxLogFileSize) {
openMode |= QIODevice::Append;
}
 
file_.open (openMode);
 
stream_.setDevice (&file_);
stream_.setCodec ("UTF-8");
}
 
~LogFile () {
stream_.flush ();
file_.flush ();
file_.close ();
}
 
template <class T>
void setMessage (const T &msg) {
if (file_.isOpen ()) {
stream_ << QDateTime::currentDateTime ().toString ("yyyy-MM-dd hh:mm:ss")
<< " " << messages_ [type_] << ": " << msg << endl;
}
}
 
private:
LogFile (const LogFile &);
LogFile &operator= (const LogFile &);
 
private:
QtMsgType type_;
QMap <QtMsgType, QString> messages_;
QMap <QtMsgType, QString> fileNames_;
 
QFile file_;
QTextStream stream_;
};
 
typedef QSharedPointer <LogFile> LogFilePtr;
 
void logMessageOutput (QtMsgType type, const char *msg)
{
static QMap <QtMsgType, LogFilePtr> files;
 
if (!files.contains (type)) {
files [type] = LogFilePtr (new LogFile (type));
}
 
files [type]->setMessage (QString::fromUtf8 (msg));
}
 
...............
 
QApplication app (argc, argv);
qInstallMsgHandler (logMessageOutput);
 


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: kolob от Май 23, 2011, 14:13
Цитировать
kolob, нехорошее решение - у тебя на каждое сообщение открывается файл.

Цитировать
Когда-то нужно было по быстренькому прикрутить логирование, вот так получилось:

Пантер а у тебя в этом примере разве не на каждое сообщение открывается файл?


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: Пантер от Май 23, 2011, 14:15
kolob, неа. Внимательно посмотри. ;)


Название: Re: Класс или компонент для логгирования раб&
Отправлено: kolob от Май 23, 2011, 14:53
Цитировать
kolob, неа. Внимательно посмотри.
Да точно, просмотрел. ;) Спасибо за пример Пантер.

А вообще зачем изобретать велосипед, когда до нас все изобрели, log4qt, log4cplus
я так считаю


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: kolob от Май 24, 2011, 10:30
Филоненко Михаил а для 3-хи log4Qt использовать можно?


Название: Re: Класс или компонент для логгирования работы программы.
Отправлено: asvil от Май 24, 2011, 10:50
3-я версия не поддерживается.