diff --git a/include/spdlog/tcp_sink.h b/include/spdlog/tcp_sink.h new file mode 100644 index 00000000..f581b71d --- /dev/null +++ b/include/spdlog/tcp_sink.h @@ -0,0 +1,51 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#include +#include +#include +#include +#include +#include + +template +class tcp_sink : public spdlog::sinks::base_sink +{ +public: + tcp_sink(std::string address,int port) + { + if ((sock_ = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + SPDLOG_THROW(spdlog::spdlog_ex("Socket creation error", errno)); + } + serv_addr_.sin_family = AF_INET; + serv_addr_.sin_port = htons(port); + if(inet_pton(AF_INET, address.c_str(), &serv_addr_.sin_addr)<=0) + { + SPDLOG_THROW(spdlog::spdlog_ex("Invalid address/ Address not supported", errno)); + } + if (connect(sock_, (struct sockaddr *)&serv_addr_, sizeof(serv_addr_)) < 0) + { + SPDLOG_THROW(spdlog::spdlog_ex("Connection Failed", errno)); + } + + } +protected: + void sink_it_(const spdlog::details::log_msg& msg) override + { + spdlog::memory_buf_t formatted; + spdlog::sinks::base_sink::formatter_->format(msg, formatted); + int res = send(sock_ , formatted.data() , formatted.size() , 0 ); + if(res < 0) + SPDLOG_THROW(spdlog::spdlog_ex("Message Send Failed", errno)); + } + + void flush_() override + { + } +private: + int sock_; + struct sockaddr_in serv_addr_; +}; +using tcp_sink_mt = tcp_sink; +using tcp_sink_st = tcp_sink;