From 21457a790c07851ac323542631d45d8dc83b881d Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Wed, 1 Sep 2021 11:21:46 +0200 Subject: [PATCH] LOG: Get a logger from the sink if it was already created --- src/Lib/Log.cc | 17 +++++++++++++++++ src/Lib/Log.hh | 7 ++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Lib/Log.cc b/src/Lib/Log.cc index e09f7480..795786f8 100644 --- a/src/Lib/Log.cc +++ b/src/Lib/Log.cc @@ -69,6 +69,23 @@ LogSink::closeLoggerClients() noexcept [](const std::weak_ptr<Logger> &weakPtr) { return !weakPtr.expired(); })); } +std::shared_ptr<Logger> +LogSink::getLoggerClient(const std::string_view category) const +{ + auto end = std::end(clientLoggers); + auto it = std::find_if(std::begin(clientLoggers), end, + [category](const std::weak_ptr<Logger> &weakPtr) { + std::shared_ptr<Logger> sharedPtr = weakPtr.lock(); + return sharedPtr && (sharedPtr->getCategoryView() == category); + }); + if (it == end) + throw std::logic_error("Logger was not found"); + std::shared_ptr<Logger> sharedPtr = (*it).lock(); + if (sharedPtr == nullptr) + throw std::logic_error("Logger has expired"); + return sharedPtr; +} + LogMessage Logger::logEvent(const char *fileName, const char *functionName, const int lineNumber, const LogLevel logSeverity) noexcept diff --git a/src/Lib/Log.hh b/src/Lib/Log.hh index a9d4a22b..64cd059d 100644 --- a/src/Lib/Log.hh +++ b/src/Lib/Log.hh @@ -53,10 +53,11 @@ public: static std::shared_ptr<LogSink> newSink() noexcept; ~LogSink() noexcept; + void recieveLogMessage(const Logger *const, LogMessage const &) noexcept; + void registerLoggerClient(std::shared_ptr<Logger>) noexcept; void closeLoggerClients() noexcept; - - void recieveLogMessage(const Logger *const, LogMessage const &) noexcept; + std::shared_ptr<Logger> getLoggerClient(const std::string_view category) const; private: std::mutex messageQueueLock{}; @@ -126,7 +127,7 @@ class Logger : public std::enable_shared_from_this<Logger> { public: // Templated constructor, construct from anything that can be considered as // a string. - explicit Logger(LogSink *const sink, const std::string_view category) noexcept + explicit Logger(LogSink *const sink, const StringType auto category) noexcept : parentLogSink(sink) , logCategory(anyStringToStdString(category)) { -- GitLab