• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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