diff options
author | bd <bdunahu@operationnull.com> | 2025-03-10 20:06:43 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-03-10 20:06:43 -0400 |
commit | a69b57c4e850e55167424d890a7a2e7a46460e71 (patch) | |
tree | aabab88d0715d3ee193069fa1a5a5eff29b56f1e | |
parent | 4dbe50416eea0fecc2aa6f5ce3dc7032c95234c5 (diff) |
Make logger a global singleton class
-rw-r--r-- | inc/logger.h | 26 | ||||
-rw-r--r-- | src/logger/logger.cc | 22 | ||||
-rw-r--r-- | src/main.cc | 20 | ||||
-rw-r--r-- | tests/logger.cc | 65 |
4 files changed, 44 insertions, 89 deletions
diff --git a/inc/logger.h b/inc/logger.h index 7ab3051..38527c8 100644 --- a/inc/logger.h +++ b/inc/logger.h @@ -9,13 +9,14 @@ enum LogLevel { DEBUG, INFO, WARNING, ERROR, CRITICAL }; class Logger { public: + static Logger* getInstance(); + + ~Logger(); + /** - * Constructor. - * @param The file name to log to. - * @return A new logger object. + * Do not allow copies. */ - Logger(const string &); - ~Logger(); + Logger(const Logger& obj) = delete; /** * Set the log level. @@ -31,10 +32,17 @@ class Logger void log(LogLevel, const string &); private: - LogLevel level = INFO; - ofstream logFile; - string levelToString(LogLevel); - int levelToInt(LogLevel); + /** + * Constructor. + * @param The file name to log to. + * @return A new logger object. + */ + Logger(const string &); + static Logger* logger_instance; + static LogLevel level; + static ofstream logFile; + static string level_to_string(LogLevel); + static int level_to_int(LogLevel); }; #endif /* LOGGER_H_INCLUDED */ diff --git a/src/logger/logger.cc b/src/logger/logger.cc index fb5052a..55d7a15 100644 --- a/src/logger/logger.cc +++ b/src/logger/logger.cc @@ -5,6 +5,10 @@ #include <sstream> using namespace std; +LogLevel Logger::level = INFO; +ofstream Logger::logFile; +Logger *Logger::logger_instance; + Logger::Logger(const string &filename) { if (!filename.empty()) { @@ -17,11 +21,11 @@ Logger::Logger(const string &filename) Logger::~Logger() { logFile.close(); } -void Logger::setLevel(LogLevel level) { this->level = level; } +void Logger::setLevel(LogLevel level) { level = level; } void Logger::log(LogLevel level, const string &message) { - if (levelToInt(level) > levelToInt(this->level)) { + if (level_to_int(level) > level_to_int(level)) { return; } @@ -31,7 +35,7 @@ void Logger::log(LogLevel level, const string &message) strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", timeinfo); ostringstream logEntry; - logEntry << "[" << timestamp << "] " << levelToString(level) << ": " + logEntry << "[" << timestamp << "] " << level_to_string(level) << ": " << message << endl; cout << logEntry.str(); @@ -42,7 +46,15 @@ void Logger::log(LogLevel level, const string &message) } } -string Logger::levelToString(LogLevel level) +Logger *Logger::getInstance() +{ + if (logger_instance == nullptr) { + logger_instance = new Logger("vector.log"); + } + return logger_instance; +} + +string Logger::level_to_string(LogLevel level) { switch (level) { case DEBUG: @@ -60,7 +72,7 @@ string Logger::levelToString(LogLevel level) } } -int Logger::levelToInt(LogLevel level) +int Logger::level_to_int(LogLevel level) { switch (level) { case DEBUG: diff --git a/src/main.cc b/src/main.cc index cc5fbb3..520a7e1 100644 --- a/src/main.cc +++ b/src/main.cc @@ -31,26 +31,26 @@ static void err() << std::endl; } -static void parseArguments(int argc, char **argv, Logger &logger, bool &python) +static void parseArguments(int argc, char **argv, bool &python) { + Logger *logger = Logger::getInstance(); struct option long_options[] = { {"debug", no_argument, 0, 'd'}, {"no-python", no_argument, 0, 'p'}, - {"version", no_argument, 0, 'v'}, {0, 0, 0, 0}}; python = true; int opt; - while ((opt = getopt_long(argc, argv, "d:p:v", long_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "d:p", long_options, NULL)) != -1) { switch (opt) { case 'd': - logger.setLevel(DEBUG); - logger.log(DEBUG, "DEBUG output enabled."); + logger->setLevel(DEBUG); + logger->log(DEBUG, "DEBUG output enabled."); break; case 'p': - logger.log(INFO, "Python will NOT be started!"); + logger->log(INFO, "Python will NOT be started!"); python = false; break; case 'v': @@ -66,17 +66,17 @@ static void parseArguments(int argc, char **argv, Logger &logger, bool &python) int main(int argc, char **argv) { print_version_number(); - Logger logger("vector.log"); + Logger *logger = Logger::getInstance(); Cli cli; - logger.log(INFO, "Initializing..."); + logger->log(INFO, "Initializing..."); bool python = true; - parseArguments(argc, argv, logger, python); + parseArguments(argc, argv, python); if (python) { // fork off python here ; - logger.log(INFO, "Python started."); + logger->log(INFO, "Python started."); } cli.run(); diff --git a/tests/logger.cc b/tests/logger.cc deleted file mode 100644 index 711dd0e..0000000 --- a/tests/logger.cc +++ /dev/null @@ -1,65 +0,0 @@ -#include "logger.h" -#include <catch2/catch_test_macros.hpp> -#include <iostream> -#include <regex> -#include <sstream> - -TEST_CASE("Logger logs higher log level", "[logger]") -{ - std::streambuf *coutBuffer = std::cout.rdbuf(); - std::ostringstream oss; - std::cout.rdbuf(oss.rdbuf()); - - Logger logger(""); - logger.setLevel(INFO); - - logger.log(ERROR, "foo bar baz qux"); - - std::cout.rdbuf(coutBuffer); - - std::string actual = oss.str(); - std::regex expected( - "\\[\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\] ERROR: " - "foo bar baz qux\\n"); - - REQUIRE(std::regex_match(actual, expected)); -} - -TEST_CASE("Logger logs equal log level", "[logger]") -{ - std::streambuf *coutBuffer = std::cout.rdbuf(); - std::ostringstream oss; - std::cout.rdbuf(oss.rdbuf()); - - Logger logger(""); - logger.setLevel(INFO); - - logger.log(INFO, "foo bar baz qux"); - - std::cout.rdbuf(coutBuffer); - - std::string actual = oss.str(); - std::regex expected("\\[\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\] INFO: " - "foo bar baz qux\\n"); - - REQUIRE(std::regex_match(actual, expected)); -} - -TEST_CASE("Logger ignores lower log level", "[logger]") -{ - std::streambuf *coutBuffer = std::cout.rdbuf(); - std::ostringstream oss; - std::cout.rdbuf(oss.rdbuf()); - - Logger logger(""); - logger.setLevel(INFO); - - logger.log(DEBUG, "foo bar baz qux"); - - std::cout.rdbuf(coutBuffer); - - std::string actual = oss.str(); - std::string expected(""); - - REQUIRE(actual == expected); -} |