Most of the time, it's just a question of sending the desired message (a QtMsgType value) to the output stream provided by qDebug():
qDebug() << "Date: " << QDate::currentDate();Moreover, the streaming operator << can be extended to provide support for custom types, for instance:
QDebug operator<<(QDebug dbg, const Circle &c) { dbg.nospace() << "Radius: " << c.radius(); return dbg.space(); }
Make it persistent
What if we need to get a copy of all the debug messages thrown by the application during a debugging session?
We can override the default message output handler, and assigning it a file as destination. The following source fragment must be present in main.cpp:
... #ifndef QT_NO_DEBUG_OUTPUT QTextStream *out = 0; void logOutput(QtMsgType type, const char *msg) { QString debugdate = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss"); switch (type) { case QtDebugMsg: debugdate += "[D]"; break; case QtWarningMsg: debugdate += "[W]"; break; case QtCriticalMsg: debugdate += "[C]"; break; case QtFatalMsg: debugdate += "[F]"; } (*out) << debugdate << " " << msg << endl; if (QtFatalMsg == type) { abort(); } } #endif int main(int argc, char *argv[]) { QApplication app(argc, argv); #ifndef QT_NO_DEBUG_OUTPUT QString fileName = QCoreApplication::applicationFilePath().replace(".exe", ".log"); QFile *log = new QFile(fileName); if (log->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { out = new QTextStream(log); qInstallMsgHandler(logOutput); } else { qDebug() << "Error opening log file '" << fileName << "'. All debug output redirected to console."; } #endif ... ... }Now all debug information will be written with a timestamp to a log file called ‘myAppName.log’ in your application's directory. When compiling your final application, be sure to add the flags -DQT_NO_DEBUG and -DQT_NO_DEBUG_OUTPUT. These will reduce the application size and ensure that the log file isn’t used. Alternately, you can keep NO_DEBUG_OUTPUT out of the Makefile if you still want the log file. This solution should suffice for every day's debugging issues. If you're in need for a more robust logging approach, you may want to consider Log4Qt, a C++ port of the Apache Software Foundation log4j package using the Qt framework. Stay tuned for an upcoming review about that tool.
Thanks for your solution of File-Logging by using the normal qDebug in Qt.
ReplyDelete