From 14d626d96181fd746cd9abd22843197eed26fe71 Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Sun, 27 Jun 2021 16:16:39 +0300 Subject: [PATCH 1/5] added mongodb sink --- include/spdlog/sinks/mongo_sink.h | 91 +++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 include/spdlog/sinks/mongo_sink.h diff --git a/include/spdlog/sinks/mongo_sink.h b/include/spdlog/sinks/mongo_sink.h new file mode 100644 index 00000000..254b8e18 --- /dev/null +++ b/include/spdlog/sinks/mongo_sink.h @@ -0,0 +1,91 @@ +/***************************************************************************** + * mongo_sink.h + * + * Created: 6/27/2021 2021 by mguludag + * + * Copyright 2021 mguludag. All rights reserved. + * + * This file may be distributed under the terms of GNU Public License version + * 3 (GPL v3) as defined by the Free Software Foundation (FSF). A copy of the + * license should have been included with this file, or the project in which + * this file belongs to. You may also find the details of GPL v3 at: + * http://www.gnu.org/licenses/gpl-3.0.txt + * + * If you have any questions regarding the use of this file, feel free to + * contact the author of this file, or the owner of the project in which + * this file belongs to. + *****************************************************************************/ +#pragma once +#include "spdlog/common.h" +#include "spdlog/details/log_msg.h" +#include "spdlog/pattern_formatter.h" +#include "spdlog/sinks/sink.h" + +#include +#include +#include + +#include +#include +#include + +#include + +namespace spdlog { +namespace sinks { +class mongo_sink : public sink { +public: + mongo_sink(const std::string &db_name, const std::string &collection_name, + const std::string &uri = "mongodb://localhost:27017") { + try { + client_ = std::make_unique(mongocxx::uri{uri}); + db_name_ = db_name; + 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, "")); + } + + void set_formatter(std::unique_ptr sink_formatter) {} + + ~mongo_sink() { flush(); } + + void flush() override {} + + void log(const details::log_msg &msg) override { + using bsoncxx::builder::stream::document; + using bsoncxx::builder::stream::finalize; + + if (client_ != nullptr) { + memory_buf_t formatted; + formatter_->format(msg, formatted); + auto doc = document{} + << "timestamp" << bsoncxx::types::b_date(msg.time) << "level" + << level::to_string_view(msg.level).data() << "message" + << std::string(formatted.begin(), formatted.end()) + << "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()); + } + } + +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_{}; +} // namespace sinks +} // namespace spdlog From 7f85a5c988b0549c7d8948377fa2c806194918be Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Sun, 27 Jun 2021 17:53:19 +0300 Subject: [PATCH 2/5] change license to mit --- include/spdlog/sinks/mongo_sink.h | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/include/spdlog/sinks/mongo_sink.h b/include/spdlog/sinks/mongo_sink.h index 254b8e18..4dbba18c 100644 --- a/include/spdlog/sinks/mongo_sink.h +++ b/include/spdlog/sinks/mongo_sink.h @@ -1,19 +1,25 @@ /***************************************************************************** * mongo_sink.h * - * Created: 6/27/2021 2021 by mguludag + * Copyright 2021 mguludag * - * Copyright 2021 mguludag. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * This file may be distributed under the terms of GNU Public License version - * 3 (GPL v3) as defined by the Free Software Foundation (FSF). A copy of the - * license should have been included with this file, or the project in which - * this file belongs to. You may also find the details of GPL v3 at: - * http://www.gnu.org/licenses/gpl-3.0.txt + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * If you have any questions regarding the use of this file, feel free to - * contact the author of this file, or the owner of the project in which - * this file belongs to. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. *****************************************************************************/ #pragma once #include "spdlog/common.h" From 514f304a47cc2ebd46e5dab4a40c7ea24074c59e Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Sun, 27 Jun 2021 18:06:44 +0300 Subject: [PATCH 3/5] changed license template for compability to other spdlog headers --- include/spdlog/sinks/mongo_sink.h | 34 ++++++++++--------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/include/spdlog/sinks/mongo_sink.h b/include/spdlog/sinks/mongo_sink.h index 4dbba18c..9bcf8689 100644 --- a/include/spdlog/sinks/mongo_sink.h +++ b/include/spdlog/sinks/mongo_sink.h @@ -1,27 +1,15 @@ -/***************************************************************************** - * mongo_sink.h - * - * Copyright 2021 mguludag - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - *****************************************************************************/ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + #pragma once + +// +// Custom sink for mongodb +// Building and using requires mongocxx library. +// For building mongocxx library check the url below +// http://mongocxx.org/mongocxx-v3/installation/ +// + #include "spdlog/common.h" #include "spdlog/details/log_msg.h" #include "spdlog/pattern_formatter.h" From 74fec56927ec28c25b53e072bef423b49f02f831 Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Sun, 27 Jun 2021 19:59:07 +0300 Subject: [PATCH 4/5] Changed base class to base_sink and added factory functions --- include/spdlog/sinks/mongo_sink.h | 62 ++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 21 deletions(-) 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 + From 9e0c658b29e643123446f747240db9e7d2240bf7 Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Sun, 27 Jun 2021 20:17:19 +0300 Subject: [PATCH 5/5] factory functions namespace fix --- include/spdlog/sinks/mongo_sink.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/spdlog/sinks/mongo_sink.h b/include/spdlog/sinks/mongo_sink.h index c2891087..afcda1fd 100644 --- a/include/spdlog/sinks/mongo_sink.h +++ b/include/spdlog/sinks/mongo_sink.h @@ -83,7 +83,9 @@ mongocxx::instance mongo_sink::instance_{}; using mongo_sink_mt = mongo_sink; using mongo_sink_st = mongo_sink; -template +} // namespace sinks + + template inline std::shared_ptr mongo_logger_mt(const std::string &logger_name, const std::string &db_name, const std::string &collection_name, @@ -100,6 +102,6 @@ mongo_logger_st(const std::string &logger_name, const std::string &db_name, return Factory::template create(logger_name, db_name, collection_name, uri); } -} // namespace sinks + } // namespace spdlog