summaryrefslogtreecommitdiff
path: root/src/components/utils/src/push_log.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/utils/src/push_log.cc')
-rw-r--r--src/components/utils/src/push_log.cc41
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() {