Made repeat thrshold settable #44

develop
Geoffrey Merck 2 years ago
parent fcb4f33831
commit 6f7a65ee61

@ -28,7 +28,8 @@ bool CLog::m_addedTargets(false);
std::recursive_mutex CLog::m_targetsMutex;
std::vector<CLogTarget *> CLog::m_targets = { new CLogConsoleTarget(LOG_DEBUG) };
std::string CLog::m_prevMsg = "";
int CLog::m_prevMsgCount = 0;
uint CLog::m_prevMsgCount = 0U;
uint CLog::m_repeatThreshold = 1U;
void CLog::addTarget(CLogTarget* target)
@ -58,6 +59,11 @@ void CLog::finalise()
m_prevMsgCount = 0;
}
uint& CLog::getRepeatThreshold()
{
return CLog::m_repeatThreshold;
}
void CLog::getTimeStamp(std::string & s)
{
std::time_t now= std::time(0);

@ -36,7 +36,8 @@ private:
static bool m_addedTargets;
static std::recursive_mutex m_targetsMutex;
static std::string m_prevMsg;
static int m_prevMsgCount;
static uint m_prevMsgCount;
static uint m_repeatThreshold;
static void getTimeStamp(std::string& s);
@ -78,9 +79,9 @@ private:
}
public:
static void addTarget(CLogTarget * target);
static void finalise();
static uint& getRepeatThreshold();
template<typename... Args> static void logTrace(const std::string & f, Args... args)
{
@ -119,22 +120,26 @@ public:
if(m_targets.empty())
return;
std::string timestamp;
getTimeStamp(timestamp);
std::string msg;
formatLogMessage(msg, severity, f, args...);
if(msg.compare(m_prevMsg) == 0) {
bool repeatedMsg = (msg.compare(m_prevMsg) == 0);
if(repeatedMsg && m_repeatThreshold > 0U) {
m_prevMsgCount++;
return;
}
else if(m_prevMsgCount != 0) {
formatLogMessage(msg, severity, "Previous message repeated %d times", m_prevMsgCount);
if(m_prevMsgCount >= m_repeatThreshold)
return;
}
m_prevMsg.assign(msg);
if(m_prevMsgCount >= m_repeatThreshold && !repeatedMsg && m_repeatThreshold > 0U) {
formatLogMessage(msg, severity, "Previous message repeated %d times", m_prevMsgCount - m_repeatThreshold + 1);
m_prevMsg.clear();
}
std::string timestamp;
getTimeStamp(timestamp);
std::string msgts;
CStringUtils::string_format_in_place(msgts, "[%s] %s", timestamp.c_str(), msg.c_str());
@ -144,7 +149,7 @@ public:
}
}
if(m_prevMsgCount != 0) {
if(m_prevMsgCount != 0 && !repeatedMsg) {
m_prevMsgCount = 0;
log(severity, f, args ...);
}

@ -43,16 +43,17 @@ namespace LogRepeatTests
}
};
TEST_F(LogRepeat, TwoMessage) {
TEST_F(LogRepeat, TwoMessage) {
CLog::logError("One Message");
CLog::logError("Two Message");
EXPECT_EQ(2, m_logTarget->m_messages.size()) << "There should be exactly two message in the log.";
EXPECT_EQ(2, m_logTarget->m_messages.size()) << "There should be exactly two messages in the log.";
EXPECT_THAT(m_logTarget->m_messages[0].c_str(), EndsWith("[ERROR ] One Message\n"));
EXPECT_THAT(m_logTarget->m_messages[1].c_str(), EndsWith("[ERROR ] Two Message\n"));
}
TEST_F(LogRepeat, ThreeIdenticalMessage) {
TEST_F(LogRepeat, ThreeIdenticalMessageThreshold1) {
CLog::getRepeatThreshold() = 1U;
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
@ -61,7 +62,8 @@ namespace LogRepeatTests
EXPECT_THAT(m_logTarget->m_messages[0].c_str(), EndsWith("[ERROR ] One Message\n"));
}
TEST_F(LogRepeat, NineIdenticalMessageOneDifferent) {
TEST_F(LogRepeat, NineIdenticalMessageTwoDifferentThreshold1) {
CLog::getRepeatThreshold() = 1U;
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
@ -72,10 +74,46 @@ namespace LogRepeatTests
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("Another Message");
CLog::logError("And here is another Message");
EXPECT_EQ(3, m_logTarget->m_messages.size()) << "There should be two message in the log.";
EXPECT_EQ(4, m_logTarget->m_messages.size()) << "There should be two message in the log.";
EXPECT_THAT(m_logTarget->m_messages[0].c_str(), EndsWith("[ERROR ] One Message\n"));
EXPECT_THAT(m_logTarget->m_messages[1].c_str(), EndsWith("[ERROR ] Previous message repeated 8 times\n"));
EXPECT_THAT(m_logTarget->m_messages[2].c_str(), EndsWith("[ERROR ] Another Message\n"));
EXPECT_THAT(m_logTarget->m_messages[3].c_str(), EndsWith("[ERROR ] And here is another Message\n"));
}
TEST_F(LogRepeat, ThreeIdenticalMessageThreshold2) {
CLog::getRepeatThreshold() = 2U;
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
EXPECT_EQ(1, m_logTarget->m_messages.size()) << "There should be two messages in the log.";
EXPECT_THAT(m_logTarget->m_messages[0].c_str(), EndsWith("[ERROR ] One Message\n"));
EXPECT_THAT(m_logTarget->m_messages[1].c_str(), EndsWith("[ERROR ] One Message\n"));
}
TEST_F(LogRepeat, NineIdenticalMessageTwoDifferentThreshold2) {
CLog::getRepeatThreshold() = 2U;
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("One Message");
CLog::logError("Another Message");
CLog::logError("And here is another Message");
EXPECT_EQ(4, m_logTarget->m_messages.size()) << "There should be two message in the log.";
EXPECT_THAT(m_logTarget->m_messages[0].c_str(), EndsWith("[ERROR ] One Message\n"));
EXPECT_THAT(m_logTarget->m_messages[1].c_str(), EndsWith("[ERROR ] One Message\n"));
EXPECT_THAT(m_logTarget->m_messages[2].c_str(), EndsWith("[ERROR ] Previous message repeated 7 times\n"));
EXPECT_THAT(m_logTarget->m_messages[3].c_str(), EndsWith("[ERROR ] Another Message\n"));
EXPECT_THAT(m_logTarget->m_messages[4].c_str(), EndsWith("[ERROR ] And here is another Message\n"));
}
}
Loading…
Cancel
Save

Powered by TurnKey Linux.