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;