diff --git a/lib/base/logger.cpp b/lib/base/logger.cpp index 5172e3a83..2b2d1dbd6 100644 --- a/lib/base/logger.cpp +++ b/lib/base/logger.cpp @@ -87,19 +87,28 @@ std::set Logger::GetLoggers() * * @returns The minimum severity. */ -LogSeverity Logger::GetMinSeverity() const +LogSeverity Logger::GetMinSeverity() +{ + if (min_severity == boost::none) { + CacheMinSeverity(); + } + return *min_severity; +} + +/** + * Retrieves and caches the minimum severity for this logger. + */ +void Logger::CacheMinSeverity() { String severity = GetSeverity(); if (severity.IsEmpty()) - return LogInformation; + min_severity.emplace(LogInformation); else { LogSeverity ls = LogInformation; - try { ls = Logger::StringToSeverity(severity); - } catch (const std::exception&) { /* use the default level */ } - - return ls; + } catch (const std::exception &) { /* use the default level */ } + min_severity.emplace(ls); } } @@ -204,7 +213,7 @@ bool Logger::IsTimestampEnabled() void Logger::SetSeverity(const String& value, bool suppress_events, const Value& cookie) { ObjectImpl::SetSeverity(value, suppress_events, cookie); - + min_severity.emplace(StringToSeverity(value)); UpdateMinLogSeverity(); } diff --git a/lib/base/logger.hpp b/lib/base/logger.hpp index 0e929d300..fb55ee3ba 100644 --- a/lib/base/logger.hpp +++ b/lib/base/logger.hpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace icinga { @@ -56,7 +57,7 @@ public: static String SeverityToString(LogSeverity severity); static LogSeverity StringToSeverity(const String& severity); - LogSeverity GetMinSeverity() const; + LogSeverity GetMinSeverity(); /** * Processes the log entry and writes it to the log that is @@ -106,6 +107,10 @@ private: static LogSeverity m_ConsoleLogSeverity; static std::mutex m_UpdateMinLogSeverityMutex; static Atomic m_MinLogSeverity; + + void CacheMinSeverity(); + + boost::optional min_severity; }; class Log