diff --git a/include/spdlog/sinks/mongo_sink.h b/include/spdlog/sinks/mongo_sink.h index 9bcf8689..c2891087 100644 --- a/include/spdlog/sinks/mongo_sink.h +++ b/include/spdlog/sinks/mongo_sink.h @@ -13,7 +13,8 @@ #include "spdlog/common.h" #include "spdlog/details/log_msg.h" #include "spdlog/pattern_formatter.h" -#include "spdlog/sinks/sink.h" +#include "spdlog/sinks/base_sink.h" +#include #include #include @@ -23,11 +24,9 @@ #include #include -#include - namespace spdlog { namespace sinks { -class mongo_sink : public sink { +template class mongo_sink : public base_sink { public: mongo_sink(const std::string &db_name, const std::string &collection_name, const std::string &uri = "mongodb://localhost:27017") { @@ -37,29 +36,20 @@ public: coll_name_ = collection_name; set_pattern("%v"); } catch (const std::exception &e) { - std::cerr << e.what() << '\n'; throw spdlog_ex("Error opening database"); } } - void set_pattern(const std::string &pattern) override { - formatter_ = std::unique_ptr( - new spdlog::pattern_formatter(pattern, pattern_time_type::local, "")); - } + ~mongo_sink() { flush_(); } - void set_formatter(std::unique_ptr sink_formatter) {} - - ~mongo_sink() { flush(); } - - void flush() override {} - - void log(const details::log_msg &msg) override { +protected: + void sink_it_(const details::log_msg &msg) { using bsoncxx::builder::stream::document; using bsoncxx::builder::stream::finalize; if (client_ != nullptr) { memory_buf_t formatted; - formatter_->format(msg, formatted); + base_sink::formatter_->format(msg, formatted); auto doc = document{} << "timestamp" << bsoncxx::types::b_date(msg.time) << "level" << level::to_string_view(msg.level).data() << "message" @@ -67,19 +57,49 @@ public: << "logger_name" << std::string(msg.logger_name.begin(), msg.logger_name.end()) << "thread_id" << static_cast(msg.thread_id) << finalize; - std::lock_guard guard(mtx_); client_->database(db_name_).collection(coll_name_).insert_one(doc.view()); } } + void flush_() {} + + void set_pattern_(const std::string &pattern) { + formatter_ = std::unique_ptr( + new spdlog::pattern_formatter(pattern, pattern_time_type::local, "")); + } + + void set_formatter_(std::unique_ptr sink_formatter) {} + private: static mongocxx::instance instance_; - std::mutex mtx_; std::string db_name_; std::string coll_name_; std::unique_ptr client_ = nullptr; - std::unique_ptr formatter_; }; -mongocxx::instance mongo_sink::instance_{}; +mongocxx::instance mongo_sink::instance_{}; + +#include "spdlog/details/null_mutex.h" +#include +using mongo_sink_mt = mongo_sink; +using mongo_sink_st = mongo_sink; + +template +inline std::shared_ptr +mongo_logger_mt(const std::string &logger_name, const std::string &db_name, + const std::string &collection_name, + const std::string &uri = "mongodb://localhost:27017") { + return Factory::template create(logger_name, db_name, + collection_name, uri); +} + +template +inline std::shared_ptr +mongo_logger_st(const std::string &logger_name, const std::string &db_name, + const std::string &collection_name, + const std::string &uri = "mongodb://localhost:27017") { + return Factory::template create(logger_name, db_name, + collection_name, uri); +} } // namespace sinks } // namespace spdlog +