diff options
Diffstat (limited to 'base/logging.cpp')
-rw-r--r-- | base/logging.cpp | 185 |
1 files changed, 115 insertions, 70 deletions
diff --git a/base/logging.cpp b/base/logging.cpp index 0f1e002a9b..1ceb63e2f7 100644 --- a/base/logging.cpp +++ b/base/logging.cpp @@ -1,5 +1,5 @@ -#include "base/assert.hpp" #include "base/logging.hpp" +#include "base/assert.hpp" #include "base/macros.hpp" #include "base/mutex.hpp" #include "base/thread.hpp" @@ -8,94 +8,139 @@ #include "std/target_os.hpp" //#include "std/windows.hpp" +#include <algorithm> #include <iomanip> #include <iostream> +#include <iterator> #include <mutex> #include <sstream> +#include <vector> namespace my { - class LogHelper - { - int m_threadsCount; - std::map<threads::ThreadID, int> m_threadID; - - int GetThreadID() - { - int & id = m_threadID[threads::GetCurrentThreadID()]; - if (id == 0) - id = ++m_threadsCount; - return id; - } - - my::Timer m_timer; - - char const * m_names[5]; - size_t m_lens[5]; - - public: - LogHelper() : m_threadsCount(0) - { - m_names[0] = "DEBUG"; m_lens[0] = 5; - m_names[1] = "INFO"; m_lens[1] = 4; - m_names[2] = "WARNING"; m_lens[2] = 7; - m_names[3] = "ERROR"; m_lens[3] = 5; - m_names[4] = "CRITICAL"; m_lens[4] = 8; - } - - void WriteProlog(std::ostream & s, LogLevel level) - { - s << "LOG"; - - s << " TID(" << GetThreadID() << ")"; - s << " " << m_names[level]; - - double const sec = m_timer.ElapsedSeconds(); - s << " " << std::setfill(' ') << std::setw(static_cast<int>(16 - m_lens[level])) << sec << " "; - } - }; - - std::mutex g_logMutex; - - void LogMessageDefault(LogLevel level, SrcPoint const & srcPoint, std::string const & msg) - { - std::lock_guard<std::mutex> lock(g_logMutex); +std::string ToString(LogLevel level) +{ + auto const & names = GetLogLevelNames(); + CHECK_LESS(level, names.size(), ()); + return names[level]; +} + +bool FromString(std::string const & s, LogLevel & level) +{ + auto const & names = GetLogLevelNames(); + auto it = std::find(names.begin(), names.end(), s); + if (it == names.end()) + return false; + level = static_cast<LogLevel>(std::distance(names.begin(), it)); + return true; +} + +std::vector<std::string> const & GetLogLevelNames() +{ + static std::vector<std::string> const kNames = { + {"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"}}; + return kNames; +} - static LogHelper logger; +class LogHelper +{ + int m_threadsCount; + std::map<threads::ThreadID, int> m_threadID; + + int GetThreadID() + { + int & id = m_threadID[threads::GetCurrentThreadID()]; + if (id == 0) + id = ++m_threadsCount; + return id; + } - std::ostringstream out; - logger.WriteProlog(out, level); + my::Timer m_timer; - out << DebugPrint(srcPoint) << msg << std::endl; - std::cerr << out.str(); + char const * m_names[5]; + size_t m_lens[5]; - CHECK_LESS(level, g_LogAbortLevel, ("Abort. Log level is too serious", level)); +public: + LogHelper() : m_threadsCount(0) + { + m_names[0] = "DEBUG"; + m_lens[0] = 5; + m_names[1] = "INFO"; + m_lens[1] = 4; + m_names[2] = "WARNING"; + m_lens[2] = 7; + m_names[3] = "ERROR"; + m_lens[3] = 5; + m_names[4] = "CRITICAL"; + m_lens[4] = 8; } - void LogMessageTests(LogLevel level, SrcPoint const &, std::string const & msg) + void WriteProlog(std::ostream & s, LogLevel level) { - std::lock_guard<std::mutex> lock(g_logMutex); + s << "LOG"; - std::ostringstream out; - out << msg << std::endl; - std::cerr << out.str(); + s << " TID(" << GetThreadID() << ")"; + s << " " << m_names[level]; - CHECK_LESS(level, g_LogAbortLevel, ("Abort. Log level is too serious", level)); + double const sec = m_timer.ElapsedSeconds(); + s << " " << std::setfill(' ') << std::setw(static_cast<int>(16 - m_lens[level])) << sec << " "; } +}; - LogMessageFn LogMessage = &LogMessageDefault; +std::mutex g_logMutex; - LogMessageFn SetLogMessageFn(LogMessageFn fn) - { - std::swap(LogMessage, fn); - return fn; - } +void LogMessageDefault(LogLevel level, SrcPoint const & srcPoint, std::string const & msg) +{ + std::lock_guard<std::mutex> lock(g_logMutex); -#ifdef DEBUG - TLogLevel g_LogLevel = {LDEBUG}; - TLogLevel g_LogAbortLevel = {LERROR}; + static LogHelper logger; + + std::ostringstream out; + logger.WriteProlog(out, level); + + out << DebugPrint(srcPoint) << msg << std::endl; + std::cerr << out.str(); + + CHECK_LESS(level, g_LogAbortLevel, ("Abort. Log level is too serious", level)); +} + +void LogMessageTests(LogLevel level, SrcPoint const &, std::string const & msg) +{ + std::lock_guard<std::mutex> lock(g_logMutex); + + std::ostringstream out; + out << msg << std::endl; + std::cerr << out.str(); + + CHECK_LESS(level, g_LogAbortLevel, ("Abort. Log level is too serious", level)); +} + +LogMessageFn LogMessage = &LogMessageDefault; + +LogMessageFn SetLogMessageFn(LogMessageFn fn) +{ + std::swap(LogMessage, fn); + return fn; +} + +LogLevel GetDefaultLogLevel() +{ +#if defined(DEBUG) + return LDEBUG; #else - TLogLevel g_LogLevel = {LINFO}; - TLogLevel g_LogAbortLevel = {LCRITICAL}; -#endif + return LINFO; +#endif // defined(DEBUG) } + +LogLevel GetDefaultLogAbortLevel() +{ +#if defined(DEBUG) + return LERROR; +#else + return LCRITICAL; +#endif // defined(DEBUG) +} + +TLogLevel g_LogLevel = {GetDefaultLogLevel()}; +TLogLevel g_LogAbortLevel = {GetDefaultLogAbortLevel()}; +} // namespace my |