From 6f7a65ee612a10f56aae2e3e71ffeb22a56f7204 Mon Sep 17 00:00:00 2001 From: Geoffrey Merck Date: Sun, 3 Mar 2024 18:47:08 +0100 Subject: [PATCH] Made repeat thrshold settable #44 --- BaseCommon/Log.cpp | 8 ++++++- BaseCommon/Log.h | 29 ++++++++++++++----------- Tests/Log/logRepeat.cpp | 48 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 67 insertions(+), 18 deletions(-) diff --git a/BaseCommon/Log.cpp b/BaseCommon/Log.cpp index 7a91e5f..2007d7f 100644 --- a/BaseCommon/Log.cpp +++ b/BaseCommon/Log.cpp @@ -28,7 +28,8 @@ bool CLog::m_addedTargets(false); std::recursive_mutex CLog::m_targetsMutex; std::vector 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); diff --git a/BaseCommon/Log.h b/BaseCommon/Log.h index 82f6313..7bf9638 100644 --- a/BaseCommon/Log.h +++ b/BaseCommon/Log.h @@ -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 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 ...); } diff --git a/Tests/Log/logRepeat.cpp b/Tests/Log/logRepeat.cpp index 23ec4c9..c67d459 100644 --- a/Tests/Log/logRepeat.cpp +++ b/Tests/Log/logRepeat.cpp @@ -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")); } } \ No newline at end of file