From 8b2e7850ef0377806d88c66cdaa1c6f8e272d5d4 Mon Sep 17 00:00:00 2001 From: "Oleksy, Maciej" Date: Fri, 22 Nov 2024 19:12:58 +0000 Subject: [PATCH 1/2] Adding setLogLevel feature * Features: * - Use `mesh::log::setLogLevel(mesh::log::Level)` to dynamically adjust log filtering. * - Supported log levels: `info`, `warn`, `error`, `debug`, `fatal`. * - Messages below the set log level will be ignored. --- media-proxy/include/mesh/logger.h | 37 ++++++++++++++++++++++++++----- media-proxy/src/mesh/logger.cc | 19 ++++++++++------ 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/media-proxy/include/mesh/logger.h b/media-proxy/include/mesh/logger.h index 8a94b0998..b7dac52a2 100644 --- a/media-proxy/include/mesh/logger.h +++ b/media-proxy/include/mesh/logger.h @@ -23,6 +23,8 @@ enum class Level { fatal }; +extern Level currentLogLevel; + class Formatter { public: virtual void formatMessage(std::ostringstream& ostream, @@ -68,14 +70,14 @@ extern std::unique_ptr formatter; class Logger { public: Logger(Level level, const char *format, va_list args); - Logger(Logger&& other) noexcept : ostream(std::move(other.ostream)) {} + Logger(Logger&& other) noexcept : level(other.level), ostream(std::move(other.ostream)) {} Logger(const Logger&) = delete; Logger& operator=(const Logger&) = delete; ~Logger(); template Logger& operator()(const char *key, const T& value) { - if (formatter) + if (formatter && level >= currentLogLevel) formatter->formatKeyValueBefore(ostream, key); using DecayedT = std::decay_t; @@ -88,12 +90,13 @@ class Logger { else ostream << value; - if (formatter) + if (formatter && level >= currentLogLevel) formatter->formatKeyValueAfter(ostream, key); return *this; } private: + Level level; std::ostringstream ostream; }; @@ -130,6 +133,31 @@ class Logger { * {"time":"2024-11-15T00:27:30.300Z","level":"error","msg":"High load","percent":99.8,"num_clients":9801} * {"time":"2024-11-15T00:27:30.300Z","level":"debug","msg":"Counter incremented","cnt":355} * {"time":"2024-11-15T00:27:30.300Z","level":"fatal","msg":"Emergency exit","err_code":312645} + * Example C: Setting the log level dynamically + * ============================================ + * mesh::log::setLogLevel(mesh::log::Level::warn); // Set minimum log level to WARN + * + * log::info("This message will not be displayed")("id", "123456"); + * log::warn("Low memory warning")("available_mb", 512); + * log::error("Critical error occurred")("error_code", 5001); + * log::debug("Debugging details")("step", "init"); + * + * Output: + * Nov 15 00:26:07.672 [WARN] Low memory warning available_mb=512 + * Nov 15 00:26:07.672 [ERRO] Critical error occurred error_code=5001 + * + * Example D: Adjusting log levels during runtime + * ============================================== + * mesh::log::setLogLevel(mesh::log::Level::debug); // Enable all log messages + * log::info("Re-enabled info logging")("reason", "debugging mode"); + * + * Output: + * Nov 15 00:26:07.672 [INFO] Re-enabled info logging reason="debugging mode" + * + * Features: + * - Use `mesh::log::setLogLevel(mesh::log::Level)` to dynamically adjust log filtering. + * - Supported log levels: `info`, `warn`, `error`, `debug`, `fatal`. + * - Messages below the set log level will be ignored. */ Logger info(const char* format, ...); Logger warn(const char* format, ...); @@ -138,8 +166,7 @@ Logger debug(const char* format, ...); Logger fatal(const char* format, ...); void setFormatter(std::unique_ptr new_formatter); - -// TODO: Add an option to set the log level. +void setLogLevel(Level level); } // namespace mesh::log diff --git a/media-proxy/src/mesh/logger.cc b/media-proxy/src/mesh/logger.cc index 40081b93c..346a75ab3 100644 --- a/media-proxy/src/mesh/logger.cc +++ b/media-proxy/src/mesh/logger.cc @@ -11,6 +11,8 @@ namespace mesh::log { +Level currentLogLevel = Level::info; + void StandardFormatter::formatMessage(std::ostringstream& ostream, Level level, const char *format, va_list args) { @@ -113,21 +115,24 @@ void setFormatter(std::unique_ptr new_formatter) formatter = std::move(new_formatter); } +void setLogLevel(Level level) { + currentLogLevel = level; +} + Logger::Logger(Level level, const char *format, va_list args) { - if (formatter) { + if (level >= currentLogLevel && formatter) { formatter->formatBefore(ostream); formatter->formatMessage(ostream, level, format, args); } } -Logger::~Logger() -{ - if (formatter) - formatter->formatAfter(ostream); - - if (!ostream.str().empty()) +Logger::~Logger() { + if (!ostream.str().empty() && level >= currentLogLevel) { + if (formatter) + formatter->formatAfter(ostream); std::cout << ostream.str() << std::endl; + } } Logger info(const char* format, ...) From 691cc1b9d506b9307f44f370f307c7ed2c9e5b2f Mon Sep 17 00:00:00 2001 From: "Oleksy, Maciej" Date: Fri, 22 Nov 2024 19:30:53 +0000 Subject: [PATCH 2/2] small fixes to description --- media-proxy/include/mesh/logger.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/media-proxy/include/mesh/logger.h b/media-proxy/include/mesh/logger.h index b7dac52a2..f059614c9 100644 --- a/media-proxy/include/mesh/logger.h +++ b/media-proxy/include/mesh/logger.h @@ -77,7 +77,7 @@ class Logger { template Logger& operator()(const char *key, const T& value) { - if (formatter && level >= currentLogLevel) + if (formatter && level >= currentLogLevel) formatter->formatKeyValueBefore(ostream, key); using DecayedT = std::decay_t; @@ -145,10 +145,10 @@ class Logger { * Output: * Nov 15 00:26:07.672 [WARN] Low memory warning available_mb=512 * Nov 15 00:26:07.672 [ERRO] Critical error occurred error_code=5001 - * + * Nov 15 00:26:07.672 [DEBU] Debugging details step=init * Example D: Adjusting log levels during runtime * ============================================== - * mesh::log::setLogLevel(mesh::log::Level::debug); // Enable all log messages + * mesh::log::setLogLevel(mesh::log::Level::info); // Enable all log messages * log::info("Re-enabled info logging")("reason", "debugging mode"); * * Output: