Приветствую!
Отладочные сообщения в QtCreator достаточно не информативные, особенно в большом проекте, а каждый раз прописывать что-то вроде:
qDebug()<<"MyClass::functionName params"<<p1<<p2;
что бы знать в каком хоть классе и функции идёт вывод достаточно долго.
Можно перехватить вывод qDebug, а заодно qInfo, qWarning и т.д. и выводить их в файл логов (либо писать в базу, либо отправлять на лог-сервер).
Делается это так:
в main.cpp сразу после QApplication app(…); прописываем:
qInstallMessageHandler(myMessageHandler);
В *.pro файле добавляем:
DEFINES += QT_MESSAGELOGCONTEXT
что бы обрабатывался контекст вызова, ну и делаем свой обработчик вывода:
#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|^)([^\\(]+)»);
Универсальная регулярка.
Ищет имена обычных функций вне класса, ищет имена классов и их методов.