Russian Qt Forum
Ноябрь 26, 2024, 09:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Класс или компонент для логгирования работы программы.  (Прочитано 9345 раз)
forallstuff
Гость
« : Март 31, 2011, 10:42 »

Здравствуйте. В процессе работы столкнулся с потребностью вести журнал работы ПО, раньше использовали cout, qDebug, иногда модуль логгироваиня компонента qtservice, но сейчас все это не подходит.
Записан
Sahab
Гость
« Ответ #1 : Март 31, 2011, 10:57 »

как вариант:
http://libqxt.bitbucket.org/doc/tip/tech-log.html

а чем qDebug не устроил?
Записан
asvil
Гость
« Ответ #2 : Март 31, 2011, 11:59 »

И тут появляюсь я с пропагандой log4qt. Итак уважаемый слушатель. log4qt это порт на Qt знаменитой библиотеки для Java. Он позволяет Вам:

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

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

https://gitorious.org/log4qt
Записан
vunder
Гость
« Ответ #3 : Март 31, 2011, 15:07 »

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

да и я сам писал, было дело, но хотелось чего-нибудь широкого и универсального, на вскидку наткнулся на log4cpp, но увидев отсутствие документации сразу плюнул. Пока остановился на qxtlib, компилирую, скоро буду тестировать.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #5 : Май 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?
Записан

Qt 5.11.0, Win, MinGW
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Май 23, 2011, 07:39 »

kolob, нехорошее решение - у тебя на каждое сообщение открывается файл.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
SASA
Гость
« Ответ #7 : Май 23, 2011, 09:49 »

http://habrahabr.ru/blogs/cpp/118165/
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Май 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);
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #9 : Май 23, 2011, 14:13 »

Цитировать
kolob, нехорошее решение - у тебя на каждое сообщение открывается файл.

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

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

Qt 5.11.0, Win, MinGW
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Май 23, 2011, 14:15 »

kolob, неа. Внимательно посмотри. Подмигивающий
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #11 : Май 23, 2011, 14:53 »

Цитировать
kolob, неа. Внимательно посмотри.
Да точно, просмотрел. Подмигивающий Спасибо за пример Пантер.

А вообще зачем изобретать велосипед, когда до нас все изобрели, log4qt, log4cplus
я так считаю
« Последнее редактирование: Май 23, 2011, 15:39 от kolob » Записан

Qt 5.11.0, Win, MinGW
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #12 : Май 24, 2011, 10:30 »

Филоненко Михаил а для 3-хи log4Qt использовать можно?
Записан

Qt 5.11.0, Win, MinGW
asvil
Гость
« Ответ #13 : Май 24, 2011, 10:50 »

3-я версия не поддерживается.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.137 секунд. Запросов: 22.