diff --git a/include/spdlog/async.h b/include/spdlog/async.h index 9264a4e3..971becd7 100644 --- a/include/spdlog/async.h +++ b/include/spdlog/async.h @@ -52,7 +52,7 @@ struct async_factory_impl auto sink = std::make_shared(std::forward(args)...); auto new_logger = std::make_shared(std::move(logger_name), std::move(sink), std::move(tp), OverflowPolicy); - registry_inst.register_and_init(new_logger); + registry_inst.initialize_logger(new_logger); return new_logger; } }; diff --git a/include/spdlog/details/registry.h b/include/spdlog/details/registry.h index 439395f7..af261ce7 100644 --- a/include/spdlog/details/registry.h +++ b/include/spdlog/details/registry.h @@ -47,13 +47,9 @@ public: loggers_[logger_name] = std::move(new_logger); } - void register_and_init(std::shared_ptr new_logger) + void initialize_logger(std::shared_ptr new_logger) { std::lock_guard lock(logger_map_mutex_); - auto logger_name = new_logger->name(); - throw_if_exists_(logger_name); - - // set the global formatter pattern new_logger->set_formatter(formatter_->clone()); if (err_handler_) @@ -64,8 +60,11 @@ public: new_logger->set_level(level_); new_logger->flush_on(flush_level_); - // add to registry - loggers_[logger_name] = std::move(new_logger); + if (automatic_registration_) + { + throw_if_exists_(new_logger->name()); + loggers_[new_logger->name()] = std::move(new_logger); + } } std::shared_ptr get(const std::string &logger_name) @@ -223,6 +222,12 @@ public: return tp_mutex_; } + void set_automatic_registration(bool automatic_regsistration) + { + std::lock_guard lock(logger_map_mutex_); + automatic_registration_ = automatic_regsistration; + } + static registry &instance() { static registry s_instance; @@ -269,6 +274,7 @@ private: std::shared_ptr tp_; std::unique_ptr periodic_flusher_; std::shared_ptr default_logger_; + bool automatic_registration_ = true; }; } // namespace details diff --git a/include/spdlog/spdlog.h b/include/spdlog/spdlog.h index bcca2e84..8c07012e 100644 --- a/include/spdlog/spdlog.h +++ b/include/spdlog/spdlog.h @@ -29,7 +29,7 @@ struct synchronous_factory { auto sink = std::make_shared(std::forward(args)...); auto new_logger = std::make_shared(std::move(logger_name), std::move(sink)); - details::registry::instance().register_and_init(new_logger); + details::registry::instance().initialize_logger(new_logger); return new_logger; } }; @@ -125,6 +125,12 @@ inline void shutdown() details::registry::instance().shutdown(); } +// Automatic registration of loggers when using spdlog::create() or spdlog::create_async +inline void set_automatic_registration(bool automatic_registation) +{ + details::registry::instance().set_automatic_registration(automatic_registation); +} + // API for using default logger (stdout_color_mt), // e.g: spdlog::info("Message {}", 1); // diff --git a/tests/test_registry.cpp b/tests/test_registry.cpp index 68833012..57976083 100644 --- a/tests/test_registry.cpp +++ b/tests/test_registry.cpp @@ -93,3 +93,20 @@ TEST_CASE("set_default_logger(nullptr)", "[registry]") spdlog::set_default_logger(nullptr); REQUIRE_FALSE(spdlog::default_logger()); } + +TEST_CASE("disable automatic registration", "[registry]") +{ + // set some global parameters + spdlog::level::level_enum log_level = spdlog::level::level_enum::warn; + spdlog::set_level(log_level); + // but disable automatic registration + spdlog::set_automatic_registration(false); + auto logger1 = spdlog::create(tested_logger_name, "filename", 11, 59); + auto logger2 = spdlog::create_async(tested_logger_name2); + // loggers should not be part of the registry + REQUIRE_FALSE(spdlog::get(tested_logger_name)); + REQUIRE_FALSE(spdlog::get(tested_logger_name2)); + // but make sure they are still initialized according to global defaults + REQUIRE(logger1->level() == log_level); + REQUIRE(logger2->level() == log_level); +}