Use unique IDs for log strings that should have repeats supressed

This commit is contained in:
Simon Walton 2018-04-02 17:32:18 -07:00
parent dc9c9fd0ee
commit 6d078f41e7
3 changed files with 54 additions and 7 deletions

View file

@ -345,12 +345,17 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe
return true;
} else {
static const QString UNKNOWN_REGEX = "Packet of type \\d+ \\([\\sa-zA-Z:]+\\) received from unknown node with UUID";
static QString repeatedMessage
= LogHandler::getInstance().addRepeatedMessageRegex(UNKNOWN_REGEX);
//static const QString UNKNOWN_REGEX = "Packet of type \\d+ \\([\\sa-zA-Z:]+\\) received from unknown node with UUID";
//static QString repeatedMessage
// = LogHandler::getInstance().addRepeatedMessageRegex(UNKNOWN_REGEX);
//qCDebug(networking) << "Packet of type" << headerType
// << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID);
qCDebug(networking) << "Packet of type" << headerType
<< "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID);
static const int repeatedIDUnknownNode = LogHandler::getInstance().newRepeatedMessageID();
QString logString;
QDebug debugString(&logString);
debugString << "Packet of type" << headerType << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID);
LogHandler::getInstance().printRepeatedMessage(repeatedIDUnknownNode, LogDebug, QMessageLogContext(), logString);
}
}

View file

@ -25,7 +25,7 @@
#include <QtCore/QThread>
#include <QtCore/QTimer>
QMutex LogHandler::_mutex;
QMutex LogHandler::_mutex(QMutex::Recursive);
LogHandler& LogHandler::getInstance() {
static LogHandler staticInstance;
@ -107,13 +107,25 @@ void LogHandler::flushRepeatedMessages() {
message.messageCount = 0;
}
// New repeat-supress scheme:
for (int m = 0; m < (int)_repeatCounts.size(); ++m) {
int repeatCount = _repeatCounts[m];
if (m > 1) {
QString repeatLogMessage = QString(m) + " repeated log entries - Last entry: \"" + _repeatedMessageStrings[m]
+ "\"";
printMessage(LogSuppressed, QMessageLogContext(), repeatLogMessage);
_repeatCounts[m] = 0;
_repeatedMessageStrings[m] = QString();
}
}
}
QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& context, const QString& message) {
QMutexLocker lock(&_mutex);
if (message.isEmpty()) {
return QString();
}
QMutexLocker lock(&_mutex);
if (type == LogDebug) {
// for debug messages, check if this matches any of our regexes for repeated log messages
@ -217,3 +229,28 @@ const QString& LogHandler::addOnlyOnceMessageRegex(const QString& regexString) {
_onetimeMessages.push_back(onetimeMessage);
return regexString;
}
int LogHandler::newRepeatedMessageID() {
QMutexLocker lock(&_mutex);
int newMessageId = _currentMessageID;
++_currentMessageID;
_repeatCounts.push_back(0);
_repeatedMessageStrings.resize(_currentMessageID);
return newMessageId;
}
void LogHandler::printRepeatedMessage(int messageID, LogMsgType type, const QMessageLogContext & context,
const QString & message) {
QMutexLocker lock(&_mutex);
if (messageID >= _currentMessageID) {
return;
}
if (_repeatCounts[messageID] == 0) {
printMessage(type, context, message);
} else {
_repeatedMessageStrings[messageID] = message;
}
++_repeatCounts[messageID];
}

View file

@ -53,6 +53,8 @@ public:
const QString& addRepeatedMessageRegex(const QString& regexString);
const QString& addOnlyOnceMessageRegex(const QString& regexString);
int newRepeatedMessageID();
void printRepeatedMessage(int messageID, LogMsgType type, const QMessageLogContext& context, const QString &message);
private slots:
void setupRepeatedMessageFlusher();
@ -81,6 +83,9 @@ private:
};
std::vector<OnceOnlyMessage> _onetimeMessages;
int _currentMessageID { 0 };
std::vector<int> _repeatCounts;
std::vector<QString> _repeatedMessageStrings;
static QMutex _mutex;
};