Blame view

3rdparty/spdlog-1.9.2/include/spdlog/sinks/tcp_sink.h 2.1 KB
3d2ab595   Hu Chunming   支持gb28181
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  // Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
  // Distributed under the MIT License (http://opensource.org/licenses/MIT)
  
  #pragma once
  
  #include <spdlog/common.h>
  #include <spdlog/sinks/base_sink.h>
  #include <spdlog/details/null_mutex.h>
  #ifdef _WIN32
  #    include <spdlog/details/tcp_client-windows.h>
  #else
  #    include <spdlog/details/tcp_client.h>
  #endif
  
  #include <mutex>
  #include <string>
  #include <chrono>
  #include <functional>
  
  #pragma once
  
  // Simple tcp client sink
  // Connects to remote address and send the formatted log.
  // Will attempt to reconnect if connection drops.
  // If more complicated behaviour is needed (i.e get responses), you can inherit it and override the sink_it_ method.
  
  namespace spdlog {
  namespace sinks {
  
  struct tcp_sink_config
  {
      std::string server_host;
      int server_port;
      bool lazy_connect = false; // if true connect on first log call instead of on construction
  
      tcp_sink_config(std::string host, int port)
          : server_host{std::move(host)}
          , server_port{port}
      {}
  };
  
  template<typename Mutex>
  class tcp_sink : public spdlog::sinks::base_sink<Mutex>
  {
  public:
      // connect to tcp host/port or throw if failed
      // host can be hostname or ip address
  
      explicit tcp_sink(tcp_sink_config sink_config)
          : config_{std::move(sink_config)}
      {
          if (!config_.lazy_connect)
          {
              this->client_.connect(config_.server_host, config_.server_port);
          }
      }
  
      ~tcp_sink() override = default;
  
  protected:
      void sink_it_(const spdlog::details::log_msg &msg) override
      {
          spdlog::memory_buf_t formatted;
          spdlog::sinks::base_sink<Mutex>::formatter_->format(msg, formatted);
          if (!client_.is_connected())
          {
              client_.connect(config_.server_host, config_.server_port);
          }
          client_.send(formatted.data(), formatted.size());
      }
  
      void flush_() override {}
      tcp_sink_config config_;
      details::tcp_client client_;
  };
  
  using tcp_sink_mt = tcp_sink<std::mutex>;
  using tcp_sink_st = tcp_sink<spdlog::details::null_mutex>;
  
  } // namespace sinks
  } // namespace spdlog