Приветствую!
Отладочные сообщения в QtCreator достаточно не информативные, особенно в большом проекте, а каждый раз прописывать что-то вроде:
qDebug()<<"MyClass::functionName params"<<p1<<p2;
что бы знать в каком хоть классе и функции идёт вывод достаточно долго.
Можно перехватить вывод qDebug, а заодно qInfo, qWarning и т.д. и выводить их в файл логов (либо писать в базу, либо отправлять на лог-сервер).
Делается это так:
в main.cpp сразу после QApplication app(…); прописываем:
main.cppqInstallMessageHandler(myMessageHandler);
В *.pro файле добавляем:
*.proDEFINES += QT_MESSAGELOGCONTEXT
что бы обрабатывался контекст вызова, ну и делаем свой обработчик вывода:
main.cpp#include <QDateTime> void myMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &msg) { QString txt; static long long uid=0; //-- номеруем вывод //-- название функции с классом, берём только класс и саму функцию QRegExp rx("([\\w-]+::[\\w-]+)"); if (rx.indexIn(context.function) ==-1) return; QString function = rx.cap(1); QString msgSep = (msg.length()>0)? ">> " : ""; switch (type) { case QtInfoMsg: txt = QString("Info: %1%2%3").arg(function).arg(msgSep).arg(msg); break; case QtDebugMsg: txt = QString("Debug: %1%2%3").arg(function).arg(msgSep).arg(msg); break; case QtWarningMsg: txt = QString("Warning: %1%2%3").arg(function).arg(msgSep).arg(msg); break; case QtCriticalMsg: txt = QString("Critical: %1%2%3").arg(function).arg(msgSep).arg(msg); break; case QtFatalMsg: txt = QString("Fatal: %1%2%3").arg(function).arg(msgSep).arg(msg); abort(); break; } QDateTime dateTime = QDateTime::currentDateTime(); uid++; txt=QString("%1:%2 %3").arg(dateTime.toString(Qt::ISODate)).arg(uid).arg(txt); QFile outFile(QString("%1/log-%2.log").arg(".").arg(QDate::currentDate().toString("dd.MM.yy"))); outFile.open(QIODevice::WriteOnly | QIODevice::Append); QTextStream ts(&outFile); ts << txt << endl; outFile.close(); }
Дальше, если у вас Линь, то достаточно просто в консольке прописать:
tail -f log-18.09.16.log
и весь вывод будет идти в реал тайме.
Если разбор выражения на отдельные поля не требуется, то можно сразу задать шаблон вывода:
в main.cpp перед QApplication прописать:
qSetMessagePattern("%{type} %{if-category}%{category}: %{endif}%{function}: %{message}");
Подробнее можно найти в офф. доках.
Вот как-то так =)
2 комментария
PS rx.cap(2)
QString function = rx.indexIn(context.function) == -1 ? «unknown» : rx.cap(2);
QRegExp rx(«([^\\s]+\\s|^)([^\\(]+)»);
Универсальная регулярка.
Ищет имена обычных функций вне класса, ищет имена классов и их методов.