From 8e3102266a587897c5f35f3bafc19d938c2e00a3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 28 Oct 2014 14:23:34 -0700 Subject: [PATCH] use the LogHandler in Interface --- interface/src/Application.cpp | 10 ++- libraries/networking/src/LimitedNodeList.cpp | 3 + libraries/shared/src/LogHandler.cpp | 66 ++++++++++++++------ libraries/shared/src/LogHandler.h | 10 ++- 4 files changed, 61 insertions(+), 28 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e1088136c4..16d8062303 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -116,12 +116,10 @@ const QString SKIP_FILENAME = QStandardPaths::writableLocation(QStandardPaths::D const QString DEFAULT_SCRIPTS_JS_URL = "http://public.highfidelity.io/scripts/defaultScripts.js"; void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString& message) { - if (message.size() > 0) { - QString dateString = QDateTime::currentDateTime().toTimeSpec(Qt::LocalTime).toString(Qt::ISODate); - QString formattedMessage = QString("[%1] %2\n").arg(dateString).arg(message); - - fprintf(stdout, "%s", qPrintable(formattedMessage)); - Application::getInstance()->getLogger()->addMessage(qPrintable(formattedMessage)); + QString logMessage = LogHandler::getInstance().printMessage(type, context, message); + + if (!logMessage.isEmpty()) { + Application::getInstance()->getLogger()->addMessage(qPrintable(logMessage)); } } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 48a94e5444..600427a733 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -212,6 +212,9 @@ bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { << uuidFromPacketHeader(packet); } } else { + static QString repeatedMessage + = LogHandler::getInstance().addRepeatedMessageRegex("Packet of type \\d+ received from unknown node with UUID"); + qDebug() << "Packet of type" << checkType << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(uuidFromPacketHeader(packet)); } diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index 123b418562..078cdf5ab6 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -17,6 +17,7 @@ #define pid_t int // hack to build #endif +#include #include #include "LogHandler.h" @@ -26,7 +27,9 @@ LogHandler& LogHandler::getInstance() { return staticInstance; } -LogHandler::LogHandler() { +LogHandler::LogHandler() : + _shouldOutputPID(false) +{ // setup our timer to flush the verbose logs every 5 seconds QTimer* logFlushTimer = new QTimer(this); connect(logFlushTimer, &QTimer::timeout, this, &LogHandler::flushRepeatedMessages); @@ -51,9 +54,33 @@ const char* stringForLogType(QtMsgType msgType) { // the following will produce 2000-10-02 13:55:36 -0700 const char DATE_STRING_FORMAT[] = "%Y-%m-%d %H:%M:%S %z"; -void LogHandler::verboseMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& message) { +void LogHandler::flushRepeatedMessages() { + QHash::iterator message = _repeatMessageCountHash.begin(); + while (message != _repeatMessageCountHash.end()) { + message = _repeatMessageCountHash.erase(message); + } +} + +QString LogHandler::printMessage(QtMsgType type, const QMessageLogContext& context, const QString& message) { + if (message.isEmpty()) { - return; + return QString(); + } + + if (type == QtDebugMsg) { + // for debug messages, check if this matches any of our regexes for repeated log messages + foreach(const QString& regexString, getInstance()._repeatedMessageRegexes) { + QRegExp repeatRegex(regexString); + if (repeatRegex.indexIn(message) != -1) { + + // we have a match - add 1 to the count of repeats for this message and set this as the last repeated message + _repeatMessageCountHash[regexString] += 1; + _lastRepeatedMessage[regexString] = message; + + // return out, we're not printing this one + return QString(); + } + } } // log prefix is in the following format @@ -70,27 +97,26 @@ void LogHandler::verboseMessageHandler(QtMsgType type, const QMessageLogContext& prefixString.append(QString(" [%1]").arg(dateString)); - prefixString.append(QString(" [%1").arg(getpid())); - - pid_t parentProcessID = getppid(); - if (parentProcessID != 0) { - prefixString.append(QString(":%1]").arg(parentProcessID)); - } else { - prefixString.append("]"); + if (_shouldOutputPID) { + prefixString.append(QString(" [%1").arg(getpid())); + + pid_t parentProcessID = getppid(); + if (parentProcessID != 0) { + prefixString.append(QString(":%1]").arg(parentProcessID)); + } else { + prefixString.append("]"); + } } - if (!getInstance()._targetName.isEmpty()) { - prefixString.append(QString(" [%1]").arg(getInstance()._targetName)); + if (!_targetName.isEmpty()) { + prefixString.append(QString(" [%1]").arg(_targetName)); } - fprintf(stdout, "%s %s\n", prefixString.toLocal8Bit().constData(), message.toLocal8Bit().constData()); + QString logMessage = QString("%1 %2").arg(prefixString, message); + fprintf(stdout, "%s\n", qPrintable(logMessage)); + return logMessage; } -void LogHandler::flushRepeatedMessages() { - QHash::iterator message = _repeatMessageCountHash.begin(); - while (message != _repeatMessageCountHash.end()) { - message = _repeatMessageCountHash.erase(message); - } +void LogHandler::verboseMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& message) { + getInstance().printMessage(type, context, message); } - - diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index e89a739c6a..abc39b7040 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -31,19 +31,25 @@ public: /// \param targetName the desired target name to output in logs void setTargetName(const QString& targetName) { _targetName = targetName; } + void setShouldOutputPID(bool shouldOutputPID) { _shouldOutputPID = shouldOutputPID; } + + QString printMessage(QtMsgType type, const QMessageLogContext& context, const QString &message); + /// a qtMessageHandler that can be hooked up to a target that links to Qt /// prints various process, message type, and time information static void verboseMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &message); - void addRepeatedMessageRegex(const QRegExp& regex) { _repeatedMessageRegexes.append(regex); } + const QString& addRepeatedMessageRegex(const QString& regexString) { return *_repeatedMessageRegexes.insert(regexString); } private: LogHandler(); void flushRepeatedMessages(); QString _targetName; - QList _repeatedMessageRegexes; + bool _shouldOutputPID; + QSet _repeatedMessageRegexes; QHash _repeatMessageCountHash; + QHash _lastRepeatedMessage; }; #endif // hifi_LogHandler_h \ No newline at end of file