1 // 2 // Copyright (c) 2015 David Schury, Gabi Melman 3 // Distributed under the MIT License (http://opensource.org/licenses/MIT) 4 // 5 6 #pragma once 7 8 #include <spdlog/details/log_msg.h> 9 #include <spdlog/details/null_mutex.h> 10 #include <spdlog/sinks/base_sink.h> 11 #include <spdlog/sinks/sink.h> 12 13 #include <algorithm> 14 #include <mutex> 15 #include <memory> 16 #include <vector> 17 18 // Distribution sink (mux). Stores a vector of sinks which get called when log is called 19 20 namespace spdlog 21 { 22 namespace sinks 23 { 24 template<class Mutex> 25 class dist_sink: public base_sink<Mutex> 26 { 27 public: dist_sink()28 explicit dist_sink() :_sinks() {} 29 dist_sink(const dist_sink&) = delete; 30 dist_sink& operator=(const dist_sink&) = delete; 31 virtual ~dist_sink() = default; 32 33 protected: 34 std::vector<std::shared_ptr<sink>> _sinks; 35 _sink_it(const details::log_msg & msg)36 void _sink_it(const details::log_msg& msg) override 37 { 38 for (auto &sink : _sinks) 39 { 40 if( sink->should_log( msg.level)) 41 { 42 sink->log(msg); 43 } 44 } 45 } 46 47 public: flush()48 void flush() override 49 { 50 std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex); 51 for (auto &sink : _sinks) 52 sink->flush(); 53 } 54 add_sink(std::shared_ptr<sink> sink)55 void add_sink(std::shared_ptr<sink> sink) 56 { 57 std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex); 58 _sinks.push_back(sink); 59 } 60 remove_sink(std::shared_ptr<sink> sink)61 void remove_sink(std::shared_ptr<sink> sink) 62 { 63 std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex); 64 _sinks.erase(std::remove(_sinks.begin(), _sinks.end(), sink), _sinks.end()); 65 } 66 }; 67 68 typedef dist_sink<std::mutex> dist_sink_mt; 69 typedef dist_sink<details::null_mutex> dist_sink_st; 70 } 71 } 72