summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-03-10 20:06:43 -0400
committerbd <bdunahu@operationnull.com>2025-03-10 20:06:43 -0400
commita69b57c4e850e55167424d890a7a2e7a46460e71 (patch)
treeaabab88d0715d3ee193069fa1a5a5eff29b56f1e
parent4dbe50416eea0fecc2aa6f5ce3dc7032c95234c5 (diff)
Make logger a global singleton class
-rw-r--r--inc/logger.h26
-rw-r--r--src/logger/logger.cc22
-rw-r--r--src/main.cc20
-rw-r--r--tests/logger.cc65
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);
-}