From 0d53e69d2104ddcf678620696b7db6cfb55ed2fc Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Thu, 12 Feb 2015 10:51:43 +0100 Subject: [PATCH] utility: added log levels for Loggers This change allows setting log levels on loggers. The apps ConsoleLogger was switched to only logging warnings and errors the FileLogger still saves all types of logs. --- src/app/main.cpp | 4 +- src/lib/utility/logging/ConsoleLogger.h | 2 +- src/lib/utility/logging/FileLogger.h | 2 +- .../logging/LogManagerImplementation.cpp | 6 +-- src/lib/utility/logging/Logger.cpp | 40 +++++++++++++++++++ src/lib/utility/logging/Logger.h | 20 +++++++++- src/lib/utility/logging/PlainFileLogger.h | 2 +- src/test/LogManagerTestSuite.h | 28 ++++++++++++- 8 files changed, 95 insertions(+), 9 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 678bef90..43a5578c 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -12,7 +12,9 @@ void init() { - LogManager::getInstance()->addLogger(std::make_shared()); + std::shared_ptr consoleLogger = std::make_shared(); + consoleLogger->setLogLevel(Logger::LOG_WARNINGS | Logger::LOG_ERRORS); + LogManager::getInstance()->addLogger(consoleLogger); LogManager::getInstance()->addLogger(std::make_shared()); utility::loadFontsFromDirectory("data/fonts", ".otf"); diff --git a/src/lib/utility/logging/ConsoleLogger.h b/src/lib/utility/logging/ConsoleLogger.h index 332543b9..98eea3d9 100644 --- a/src/lib/utility/logging/ConsoleLogger.h +++ b/src/lib/utility/logging/ConsoleLogger.h @@ -10,11 +10,11 @@ public: ConsoleLogger(); ~ConsoleLogger(); +private: virtual void logInfo(const LogMessage& message); virtual void logWarning(const LogMessage& message); virtual void logError(const LogMessage& message); -private: void logMessage(const std::string& type, const LogMessage& message); }; diff --git a/src/lib/utility/logging/FileLogger.h b/src/lib/utility/logging/FileLogger.h index e6b8d2c9..0e21a628 100644 --- a/src/lib/utility/logging/FileLogger.h +++ b/src/lib/utility/logging/FileLogger.h @@ -12,11 +12,11 @@ public: FileLogger(); virtual ~FileLogger(); +private: virtual void logInfo(const LogMessage& message); virtual void logWarning(const LogMessage& message); virtual void logError(const LogMessage& message); -private: static const std::string s_filePath; void setupFileName(); diff --git a/src/lib/utility/logging/LogManagerImplementation.cpp b/src/lib/utility/logging/LogManagerImplementation.cpp index 92b008c9..e6e80dbe 100644 --- a/src/lib/utility/logging/LogManagerImplementation.cpp +++ b/src/lib/utility/logging/LogManagerImplementation.cpp @@ -65,7 +65,7 @@ void LogManagerImplementation::logInfo( std::lock_guard lockGuardLogger(m_loggerMutex); for (unsigned int i = 0; i < m_loggers.size(); i++) { - m_loggers[i]->logInfo(LogMessage(message, file, function, line, getTime())); + m_loggers[i]->onInfo(LogMessage(message, file, function, line, getTime())); } } @@ -79,7 +79,7 @@ void LogManagerImplementation::logWarning( std::lock_guard lockGuardLogger(m_loggerMutex); for (unsigned int i = 0; i < m_loggers.size(); i++) { - m_loggers[i]->logWarning(LogMessage(message, file, function, line, getTime())); + m_loggers[i]->onWarning(LogMessage(message, file, function, line, getTime())); } } @@ -93,7 +93,7 @@ void LogManagerImplementation::logError( std::lock_guard lockGuardLogger(m_loggerMutex); for (unsigned int i = 0; i < m_loggers.size(); i++) { - m_loggers[i]->logError(LogMessage(message, file, function, line, getTime())); + m_loggers[i]->onError(LogMessage(message, file, function, line, getTime())); } } diff --git a/src/lib/utility/logging/Logger.cpp b/src/lib/utility/logging/Logger.cpp index 575f2242..5e392436 100644 --- a/src/lib/utility/logging/Logger.cpp +++ b/src/lib/utility/logging/Logger.cpp @@ -2,6 +2,7 @@ Logger::Logger(const std::string& type) : m_type(type) + , m_levelMask(LOG_ALL) { } @@ -13,3 +14,42 @@ std::string Logger::getType() const { return m_type; } + +Logger::LogLevelMask Logger::getLogLevel() const +{ + return m_levelMask; +} + +void Logger::setLogLevel(LogLevelMask mask) +{ + m_levelMask = mask; +} + +bool Logger::isLogLevel(LogLevelMask mask) +{ + return (m_levelMask & mask) > 0; +} + +void Logger::onInfo(const LogMessage& message) +{ + if (isLogLevel(LOG_INFOS)) + { + logInfo(message); + } +} + +void Logger::onWarning(const LogMessage& message) +{ + if (isLogLevel(LOG_WARNINGS)) + { + logWarning(message); + } +} + +void Logger::onError(const LogMessage& message) +{ + if (isLogLevel(LOG_ERRORS)) + { + logError(message); + } +} diff --git a/src/lib/utility/logging/Logger.h b/src/lib/utility/logging/Logger.h index 4c671eac..63bf5647 100644 --- a/src/lib/utility/logging/Logger.h +++ b/src/lib/utility/logging/Logger.h @@ -9,17 +9,35 @@ class Logger { public: + typedef int LogLevelMask; + enum LogLevel : int + { + LOG_INFOS = 0x1, + LOG_WARNINGS = 0x2, + LOG_ERRORS = 0x4, + LOG_ALL = 0x7 + }; + Logger(const std::string& type); virtual ~Logger(); std::string getType() const; + LogLevelMask getLogLevel() const; + void setLogLevel(LogLevelMask mask); + bool isLogLevel(LogLevelMask mask); + + void onInfo(const LogMessage& message); + void onWarning(const LogMessage& message); + void onError(const LogMessage& message); + +private: virtual void logInfo(const LogMessage& message) = 0; virtual void logWarning(const LogMessage& message) = 0; virtual void logError(const LogMessage& message) = 0; -private: const std::string m_type; + LogLevelMask m_levelMask; }; #endif // LOGGER_H diff --git a/src/lib/utility/logging/PlainFileLogger.h b/src/lib/utility/logging/PlainFileLogger.h index 4e87710c..7b85fd59 100644 --- a/src/lib/utility/logging/PlainFileLogger.h +++ b/src/lib/utility/logging/PlainFileLogger.h @@ -14,11 +14,11 @@ public: void logString(std::string str); +private: virtual void logInfo(const LogMessage& message); virtual void logWarning(const LogMessage& message); virtual void logError(const LogMessage& message); -private: void logMessage(const std::string& type, const LogMessage& message); std::string m_filePath; diff --git a/src/test/LogManagerTestSuite.h b/src/test/LogManagerTestSuite.h index e957ef94..ab780efc 100644 --- a/src/test/LogManagerTestSuite.h +++ b/src/test/LogManagerTestSuite.h @@ -85,6 +85,32 @@ public: TS_ASSERT_EQUALS(log, lastLog); } + void test_logger_logs_only_logs_of_defined_log_level() + { + LogManagerImplementation logManagerImplementation; + + std::string info = "info"; + std::string warning = "warning"; + std::string error = "error"; + + std::shared_ptr logger = std::make_shared(); + + logger->setLogLevel(Logger::LOG_INFOS | Logger::LOG_ERRORS); + + logManagerImplementation.addLogger(logger); + + logManagerImplementation.logInfo(info, __FILE__, __FUNCTION__, __LINE__); + logManagerImplementation.logWarning(warning, __FILE__, __FUNCTION__, __LINE__); + logManagerImplementation.logError(error, __FILE__, __FUNCTION__, __LINE__); + + TS_ASSERT_EQUALS(1, logger->getMessageCount()); + TS_ASSERT_EQUALS(0, logger->getWarningCount()); + TS_ASSERT_EQUALS(1, logger->getErrorCount()); + + TS_ASSERT_EQUALS(info, logger->getLastMessage()); + TS_ASSERT_EQUALS(error, logger->getLastError()); + } + void test_new_logger_can_be_added_to_manager_threaded() { LogManagerImplementation logManagerImplementation; @@ -183,11 +209,11 @@ private: std::string getLastWarning() const; std::string getLastError() const; + private: void logInfo(const LogMessage& message); void logWarning(const LogMessage& message); void logError(const LogMessage& message); - private: int m_logMessageCount; int m_logWarningCount; int m_logErrorCount;