Ref T184 Use CTokenBucket to throttle identical log messages.

This commit is contained in:
Mathew Sutcliffe
2017-11-08 21:27:22 +00:00
parent dbb67b385b
commit 23becf9619
3 changed files with 23 additions and 1 deletions

View File

@@ -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);
}