diff --git a/src/blackmisc/loghandler.cpp b/src/blackmisc/loghandler.cpp index 574c305cf..cfe8ffff5 100644 --- a/src/blackmisc/loghandler.cpp +++ b/src/blackmisc/loghandler.cpp @@ -126,6 +126,25 @@ namespace BlackMisc void CLogHandler::logLocalMessage(const CStatusMessage &statusMessage) { + using namespace BlackMisc::PhysicalQuantities; + auto bucket = m_tokenBuckets.find(statusMessage); + if (bucket == m_tokenBuckets.end()) { bucket = m_tokenBuckets.insert(statusMessage, { { 5, CTime(1, CTimeUnit::s()), 1 }, 0 }); } + if (! bucket->first.tryConsume()) + { + bucket->second++; + return; + } + if (bucket->second > 0) + { + auto copy = statusMessage; + copy.appendMessage(QStringLiteral(" (+%1 identical messages)").arg(bucket->second)); + bucket->second = 0; + + logMessage(copy); + emit localMessageLogged(copy); + return; + } + logMessage(statusMessage); emit localMessageLogged(statusMessage); } diff --git a/src/blackmisc/loghandler.h b/src/blackmisc/loghandler.h index 178a6bbce..99d6a1274 100644 --- a/src/blackmisc/loghandler.h +++ b/src/blackmisc/loghandler.h @@ -16,8 +16,10 @@ #include "blackmisc/logcategory.h" #include "blackmisc/logpattern.h" #include "blackmisc/statusmessage.h" +#include "blackmisc/tokenbucket.h" #include +#include #include #include #include @@ -105,6 +107,7 @@ namespace BlackMisc QList m_patternHandlers; QList handlersForMessage(const CStatusMessage &message) const; void removePatternHandler(CLogPatternHandler *); + QHash> m_tokenBuckets; }; /*! diff --git a/src/blackmisc/statusmessage.h b/src/blackmisc/statusmessage.h index 3afff1a1e..d6c4bcb60 100644 --- a/src/blackmisc/statusmessage.h +++ b/src/blackmisc/statusmessage.h @@ -362,7 +362,7 @@ namespace BlackMisc BLACK_METAMEMBER(severity), BLACK_METAMEMBER(message), BLACK_METAMEMBER(args), - BLACK_METAMEMBER(timestampMSecsSinceEpoch) + BLACK_METAMEMBER(timestampMSecsSinceEpoch, 0, DisabledForHashing | DisabledForComparison) ); };