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

View File

@@ -16,8 +16,10 @@
#include "blackmisc/logcategory.h"
#include "blackmisc/logpattern.h"
#include "blackmisc/statusmessage.h"
#include "blackmisc/tokenbucket.h"
#include <QList>
#include <QHash>
#include <QMetaMethod>
#include <QMetaObject>
#include <QObject>
@@ -105,6 +107,7 @@ namespace BlackMisc
QList<PatternPair> m_patternHandlers;
QList<CLogPatternHandler *> handlersForMessage(const CStatusMessage &message) const;
void removePatternHandler(CLogPatternHandler *);
QHash<CStatusMessage, std::pair<CTokenBucket, int>> m_tokenBuckets;
};
/*!

View File

@@ -362,7 +362,7 @@ namespace BlackMisc
BLACK_METAMEMBER(severity),
BLACK_METAMEMBER(message),
BLACK_METAMEMBER(args),
BLACK_METAMEMBER(timestampMSecsSinceEpoch)
BLACK_METAMEMBER(timestampMSecsSinceEpoch, 0, DisabledForHashing | DisabledForComparison)
);
};