bitz-server  2.0.0
dist_sink.h
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 "../details/log_msg.h"
9 #include "../details/null_mutex.h"
10 #include "base_sink.h"
11 #include "sink.h"
12 
13 #include <algorithm>
14 #include <memory>
15 #include <mutex>
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 namespace sinks {
22 template<class Mutex>
23 class dist_sink : public base_sink<Mutex>
24 {
25 public:
26  explicit dist_sink()
27  : _sinks()
28  {
29  }
30  dist_sink(const dist_sink &) = delete;
31  dist_sink &operator=(const dist_sink &) = delete;
32 
33 protected:
34  std::vector<std::shared_ptr<sink>> _sinks;
35 
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  void _flush() override
48  {
49  for (auto &sink : _sinks)
50  sink->flush();
51  }
52 
53 public:
54  void add_sink(std::shared_ptr<sink> sink)
55  {
56  std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex);
57  _sinks.push_back(sink);
58  }
59 
60  void remove_sink(std::shared_ptr<sink> sink)
61  {
62  std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex);
63  _sinks.erase(std::remove(_sinks.begin(), _sinks.end(), sink), _sinks.end());
64  }
65 
66  void remove_all_sinks()
67  {
68  std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex);
69  _sinks.clear();
70  }
71 };
72 
75 
76 } // namespace sinks
77 } // namespace spdlog
Definition: async_logger.h:26
Definition: log_msg.h:16
Definition: dist_sink.h:23
Definition: sink.h:12
Definition: base_sink.h:23