diff options
Diffstat (limited to 'src/components/utils/src/push_log.cc')
-rw-r--r-- | src/components/utils/src/push_log.cc | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/src/components/utils/src/push_log.cc b/src/components/utils/src/push_log.cc index dea0e75274..f9d1cd738a 100644 --- a/src/components/utils/src/push_log.cc +++ b/src/components/utils/src/push_log.cc @@ -41,7 +41,16 @@ struct __attribute__((visibility("default"))) LogsEnabled { }; std::atomic_bool LogsEnabled::logs_enabled_(false); -static std::unique_ptr<LogMessageLoopThread> log_message_loop_thread; + +template <typename T> +using logger_ptr = std::unique_ptr<T, std::function<void(T*)> >; + +static logger_ptr<LogMessageLoopThread> log_message_loop_thread; + +auto deinit_logger = [](LogMessageLoopThread* logMsgThread) { + delete logMsgThread; + logger::logger_status = logger::LoggerThreadNotCreated; +}; bool push_log(log4cxx::LoggerPtr logger, log4cxx::LevelPtr level, @@ -86,13 +95,37 @@ void set_logs_enabled(bool state) { void create_log_message_loop_thread() { if (!log_message_loop_thread) { - log_message_loop_thread = - std::unique_ptr<LogMessageLoopThread>(new LogMessageLoopThread); + log_message_loop_thread = logger_ptr<LogMessageLoopThread>( + new LogMessageLoopThread, deinit_logger); } } -void delete_log_message_loop_thread() { +void delete_log_message_loop_thread(log4cxx::LoggerPtr& logger) { + if (logger::logger_status == logger::LoggerThreadCreated) { + logger::flush_logger(); + } + log_message_loop_thread.reset(); + + if (LOG4CXX_UNLIKELY(logger->isDebugEnabled())) { + ::log4cxx::helpers::MessageBuffer oss_; + logger->forcedLog(::log4cxx::Level::getDebug(), + oss_.str(oss_ << "Logger loop thread deinitialized"), + LOG4CXX_LOCATION); + } + + if (logger->getRootLogger() == logger) { + return; + } + + if (LOG4CXX_UNLIKELY(logger->isDebugEnabled())) { + ::log4cxx::helpers::MessageBuffer oss_; + logger->forcedLog(::log4cxx::Level::getDebug(), + oss_.str(oss_ << "Logger calling removeAllAppenders"), + LOG4CXX_LOCATION); + } + + logger->removeAllAppenders(); } void flush_logger() { |