Приветствую!

Отладочные сообщения в QtCreator достаточно не информативные, особенно в большом проекте, а каждый раз прописывать  что-то вроде:

qDebug()<<"MyClass::functionName params"<<p1<<p2;

что бы знать в каком хоть классе и функции идёт вывод достаточно долго.

Можно перехватить вывод qDebug, а заодно qInfo, qWarning и т.д. и выводить их в файл логов (либо писать в базу, либо отправлять на лог-сервер).

Делается это так:

в main.cpp  сразу после QApplication app(…); прописываем:

main.cpp
qInstallMessageHandler(myMessageHandler);

В *.pro файле добавляем:

*.pro
DEFINES += 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 комментария

Mait 26 июня 2019 - 14:54

PS rx.cap(2)

QString function = rx.indexIn(context.function) == -1 ? «unknown» : rx.cap(2);

Reply
Mait 26 июня 2019 - 14:52

QRegExp rx(«([^\\s]+\\s|^)([^\\(]+)»);

Универсальная регулярка.
Ищет имена обычных функций вне класса, ищет имена классов и их методов.

Reply

Leave a Comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

You may also like