| 1 | #include <fmt/core.h> |
| 2 |
|
| 3 | #include "ZydecoCommon.hpp" |
| 4 | #include "Logger.hpp" |
| 5 |
|
| 6 |
|
| 7 | static Logger LOGGER("Logger"); |
| 8 |
|
| 9 | static const char *VERBOSITY_STRINGS[] = { |
| 10 | "", // DISABLED |
| 11 | "\e[1;031m[ ERROR ]\e[0m", |
| 12 | "\e[1;033m[ WARNING ]\e[0m", |
| 13 | "\e[1;034m[ INFO ]\e[0m", |
| 14 | "\e[1;035m[ DEBUG ]\e[0m", |
| 15 | "\e[1;036m[ VERBOSE ]\e[0m", |
| 16 | "\e[1;037m[ TRACE ]\e[0m", |
| 17 | }; |
| 18 |
|
| 19 | // static initialize members |
| 20 | std::ostream *Logger::s_ostream = nullptr; |
| 21 | Logger::Verbosity Logger::s_maxVerbosity = Logger::DEBUG; |
| 22 | int Logger::s_loggerNameLongestLen = 0; |
| 23 | std::mutex Logger::s_outputMutex {}; |
| 24 |
|
| 25 |
|
| 26 | Logger::Logger(std::string logger_name): |
| 27 | m_loggerName(logger_name), |
| 28 | m_loggerNameLen(logger_name.length()) |
| 29 | { |
| 30 | if (m_loggerNameLen > s_loggerNameLongestLen) { s_loggerNameLongestLen = m_loggerNameLen; } |
| 31 | } |
| 32 |
|
| 33 | // should be called once |
| 34 | void Logger::InitializeLogging(Verbosity max_verbosity, std::ostream *stream) |
| 35 | { |
| 36 | if (stream != nullptr) |
| 37 | { |
| 38 | s_maxVerbosity = max_verbosity; |
| 39 | s_ostream = stream; |
| 40 |
|
| 41 | LOGGER.Log(DEBUG, "InitializeLogging(): Initialized logger with max verbosity {0}", VERBOSITY_STRINGS[max_verbosity]); |
| 42 | } |
| 43 | } |
| 44 |
|
| 45 | // output debug message |
| 46 | void Logger::Log(Verbosity verbosity, std::string message) |
| 47 | { |
| 48 | if (s_ostream != nullptr && verbosity <= s_maxVerbosity) |
| 49 | { |
| 50 | if (s_loggerNameLongestLen != m_loggerNameLongestLen) |
| 51 | { |
| 52 | m_loggerNameLongestLen = s_loggerNameLongestLen; |
| 53 |
|
| 54 | int left_padding_count = m_loggerNameLongestLen - m_loggerNameLen; |
| 55 | char left_padding[left_padding_count + 1]; |
| 56 |
|
| 57 | for (int i = 0; i < left_padding_count; i++) |
| 58 | { |
| 59 | left_padding[i] = ' '; |
| 60 | } |
| 61 | left_padding[left_padding_count] = '\0'; |
| 62 | m_leftPadding = std::string(left_padding); |
| 63 | } |
| 64 | s_outputMutex.lock(); |
| 65 | *s_ostream << VERBOSITY_STRINGS[verbosity] << m_leftPadding << " \e[090m" << m_loggerName << "\e[0m::" << message << "\n"; |
| 66 | s_outputMutex.unlock(); |
| 67 | } |
| 68 | } |
| 69 |
|