Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вывод отладочной информации, централизованно
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
balbes
Нужно выводить отладочную информацию в файл, но на данный момент у меня натыкано очень много qDebug'ов и qCritical'ов, который соответственно выводят на консоль. Выходом из сложившейся ситуации, вижу только написание синглтона, и замену qDebug'ов и qCritical'ов на вызов соответствующих методов из него.

Может можно это сделать как-то красивее? А то менять очень и очень много нужно... :(
ubuntu
Используй qInstallMsgHandler( fnc);
balbes
Непонятно, как это относится к моей проблеме, пример можно?
ViGOur
Примерно так:
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>

void myMessageOutput(QtMsgType type, const char *msg)
{
     switch (type) {
     case QtDebugMsg:
         fprintf(stderr, "Debug: %s\n", msg);
         break;
     case QtWarningMsg:
         fprintf(stderr, "Warning: %s\n", msg);
         break;
     case QtCriticalMsg:
         fprintf(stderr, "Critical: %s\n", msg);
         break;
     case QtFatalMsg:
         fprintf(stderr, "Fatal: %s\n", msg);
         abort();
     }
}

int main(int argc, char **argv)
{
     qInstallMsgHandler(myMessageOutput);
     QApplication app(argc, argv);
     // ...
     return app.exec();
}


Пример взят отсель: qInstallMsgHandler
balbes
Спасибо, то что доктор прописал... :)
CodeHunter
Цитата(ViGOur @ 25.10.2007, 16:59) *
Примерно так:
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>

void myMessageOutput(QtMsgType type, const char *msg)
{
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s\n", msg);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s\n", msg);
abort();
}
}

int main(int argc, char **argv)
{
qInstallMsgHandler(myMessageOutput);
QApplication app(argc, argv);
// ...
return app.exec();
}


Сегодня я уже второй рас вижу плохой пример !! ))) ну ничего у ViGOur есть и куча други хороших примеров !

Так вот если посмотреть в доки то там можно увидеть такое :
Цитата
QDebug::QDebug ( QIODevice * device )
Constructs a debug stream that writes to the given device.


Значит если создать обект класа QDebug и в конструктор передать указатель на QFile , то все что ты перенаправлял на консоль будет писаться в файл. Осталось ток красиво оформить вывод и вуаля лог готов !!!
Litkevich Yuriy
Цитата(CodeHunter @ 23.9.2010, 16:21) *
Осталось ток красиво оформить вывод и вуаля лог готов !!!
ага и весь код переписать, который написан в прошлом году :)
igor_bogomolov
Цитата(CodeHunter)
Сегодня я уже второй рас вижу плохой пример !! )))
А я сегодня вижу уже второй некропост от тебя. Ты на дату прежде бы смотрел.
Litkevich Yuriy
Цитата(igor_bogomolov @ 23.9.2010, 17:17) *
уже второй некропост от тебя
я не против подъёма старой темы, лишь бы противоречий не было (как с итератором файлов)
igor_bogomolov
Цитата(Litkevich Yuriy)
я не против подъёма старой темы, лишь бы противоречий не было (как с итератором файлов)
Я в общем то тоже, если только это делается с целью уточнения ответа.
Здесь же опять не понятно, чем этот комментарий мог бы помочь автору темы
Цитата(balbes)
у меня натыкано очень много qDebug'ов и qCritical'ов
kwisp
почему просто средствами ОС не перенаправить стандартный вывод куда надо?
Цитата(CodeHunter @ 23.9.2010, 13:21) *
Сегодня я уже второй рас вижу плохой пример !! ))) ну ничего у ViGOur есть и куча други хороших примеров !

это отличный пример централизированной работы с выводом в лог, очень гибкий пример.
сам использую qInstallMsgHandler практически во всех программах.
имею несколько обработчиков, установку которых регулирую через файл конфигурации один пишет в стандартный вывод, другой в syslog ...
CodeHunter
Цитата(igor_bogomolov @ 23.9.2010, 13:55) *
Здесь же опять не понятно, чем этот комментарий мог бы помочь автору темы


Когда у нас есть объект класа дебага... Мы легко можем заменить qDebug() << "TEXT" на myDebug << "TEXT" Простой комбинацией найти + заменить

И мы получаем вывод в файл !!
А критикалы можно на другой объект заменить и получаем вывод в другой файл.

В результате мы получаем 2 файла (Дебаг + Лог ошибок) !


Цитата(Litkevich Yuriy @ 23.9.2010, 13:25) *
(как с итератором файлов)



А какие там противоречия ?
igor_bogomolov
Цитата(CodeHunter)
Когда у нас есть объект класа дебага... Мы легко можем заменить qDebug() << "TEXT" на myDebug << "TEXT" Простой комбинацией найти + заменить

И мы получаем вывод в файл !!
А критикалы можно на другой объект заменить и получаем вывод в другой файл.

В результате мы получаем 2 файла (Дебаг + Лог ошибок) !
И что мы получаем в итоге, что мы не можем перенаправить сообщения Qt, а только свои собственные. Мы не можем выводить всю отладочную информацию в один файл, потому что не сможем отделить сообщения разного вида. При этом вынуждены рыскать по проекту, что бы заменить один способ вывода информации на другой, вместо того, что бы делать это централизованно.

Т.е. ни одного плюса и куча минусов от твоего способа. Поэтому твой пример крайне не удачен.
CodeHunter
Цитата(igor_bogomolov @ 24.9.2010, 8:46) *
И что мы получаем в итоге, что мы не можем перенаправить сообщения Qt, а только свои собственные. Мы не можем выводить всю отладочную информацию в один файл, потому что не сможем отделить сообщения разного вида. При этом вынуждены рыскать по проекту, что бы заменить один способ вывода информации на другой, вместо того, что бы делать это централизованно.

Т.е. ни одного плюса и куча минусов от твоего способа. Поэтому твой пример крайне не удачен.



Смотри что человер хотел с самого начала и что ему дали !
igor_bogomolov
Цитата
Смотри что человер хотел с самого начала и что ему дали !
Я то как раз и смотрю, в отличии от тебя. Ему дали идеальное решение его проблемы. Ты предлагаешь полную ерунду.
CodeHunter
Цитата(igor_bogomolov @ 24.9.2010, 9:32) *
Ему дали идеальное решение его проблемы.



Он хотел выводить инфу в файл !!!!!
igor_bogomolov
CodeHunter, да что ж ты какой не адекватный. Читай ассистент по поводу qInstallMsgHandler, потом спорь.
Тему закрываю.
Litkevich Yuriy
Цитата(igor_bogomolov @ 24.9.2010, 13:46) *
Тему закрываю.
не, закрывать не надо. У меня кой чего по ней есть, только писать пока времени нет.

Цитата(CodeHunter @ 24.9.2010, 13:43) *
Он хотел выводить инфу в файл !!!!!
и он её выводит, без изменения всех исходников. Просто есть обезьяний подход - исправление всех исходников, а есть программистский - установка глобального обработчика. Решение красивое и предусмотренное библиотекой Qt.
sfour.aj
Здравствуйте. Вижу, что тема закрыта, но не я мог обойти столь напряженную дискуссию :rolleyes:
Я в каждом серьезном проекте использую вывод логов в файл, так называемую экстремальную отладку. Делаю я это через тот же MsgHandler, все отлично работает:

void myMessageOutput(QtMsgType type, const char *msg)
{
QFile fMessFile(qApp->applicationDirPath() + "/myProjectLog.log");
if(!fMessFile.open(QIODevice::Append | QIODevice::Text)){
return;
}
QString sCurrDateTime = "[" + QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss.zzz") + "]";
QTextStream tsTextStream(&fMessFile);
switch(type){
case QtDebugMsg:
tsTextStream << QString("myProjectLogDebug%1: %2\n").arg(sCurrDateTime).arg(msg);
break;
case QtWarningMsg:
tsTextStream << QString("myProjectLogWarning%1: %2\n").arg(sCurrDateTime).arg(msg);
break;
case QtCriticalMsg:
tsTextStream << QString("myProjectLogCritical%1: %2\n").arg(sCurrDateTime).arg(msg);
break;
case QtFatalMsg:
tsTextStream << QString("myProjectLogFatal%1: %2\n").arg(sCurrDateTime).arg(msg);
abort();
}
tsTextStream.flush();
fMessFile.flush();
fMessFile.close();
}


Такой вариант меня еще ни разу не подводил. Хотя вариант с созданием переменной QDebug тоже вполне рабочий, этот будет более изящным (ИМХО)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.