Chatsync  bbffde5c0c672a526bdc83637acf66dc20a80fbf
logging.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <iostream>
3 #include <queue>
4 #include <mutex>
5 #include <condition_variable>
6 #include <chrono>
7 #include <thread>
8 #include <atomic>
9 #include <sstream>
10 #include <iomanip>
11 
12 #define LOG(lvl) logging::LogWriter<lvl>
13 #define TRACE LOG(logging::Severity::trace)() << __FILE__ << ":" << __LINE__ << " "
14 #define DEBUG LOG(logging::Severity::debug)()
15 #define INFO LOG(logging::Severity::info)()
16 #define WARNING LOG(logging::Severity::warning)()
17 #define ERROR LOG(logging::Severity::error)()
18 #define FATAL LOG(logging::Severity::fatal)()
19 
20 #define DEFAULT_LOGGING \
21  auto default_sink = std::make_shared<logging::LogSinkPrinter>(); \
22  logging::LoggerImpl::get().setOutput(std::static_pointer_cast<logging::LogSink>(default_sink));
23 
24 namespace logging {
25  enum Severity {
32  };
33 
34  const std::string severity_lines[] = {"FATAL", "ERROR", "WARNING",
35  "INFO", "DEBUG", "TRACE"};
36 
40  struct LogMessage {
41  const std::chrono::high_resolution_clock::time_point _timestamp;
43  const std::string _message;
44  LogMessage(const std::chrono::high_resolution_clock::time_point t,
45  const Severity s,
46  const std::string & m) :
47  _timestamp(t),
48  _severity(s),
49  _message(m) {};
50  };
51 
55  struct LogSink {
59  virtual void write(const LogMessage&& msg) = 0;
60  };
61 
65  class LogSinkPrinter: public LogSink {
69  std::string formatMessage(const LogMessage&& msg) const;
70  public:
71  void write(const LogMessage&& msg) override;
72  };
73 
85  class LoggerImpl {
86  std::queue<LogMessage> _messages;
87  std::mutex _mutex;
88  std::condition_variable _cond;
89  std::unique_ptr<std::thread> _writer;
90  std::atomic_bool _running;
91  unsigned int _log_repeat;
92  std::weak_ptr<LogSink> _sink;
99  void writeOut();
100  public:
101  static LoggerImpl& get();
103  LoggerImpl(LoggerImpl const&) = delete;
104  LoggerImpl(LoggerImpl&&) = delete;
105  LoggerImpl& operator=(LoggerImpl const&) = delete;
106  LoggerImpl& operator=(LoggerImpl&&) = delete;
107 
111  void log(const LogMessage&& msg);
112 
118  void setOutput(const std::shared_ptr<LogSink>& output);
119 
120  protected:
122  _messages(),
123  _mutex(),
124  _cond(),
125  _writer(nullptr),
126  _running(ATOMIC_FLAG_INIT),
127  _log_repeat(1)
128  {}
129 
131  if (_writer) {
132  while (!_messages.empty() && !_sink.expired()) { _cond.notify_one(); }
133  _running = false;
134  _writer->detach();
135  _cond.notify_one();
136  }
137  }
138  };
139 
148  template <Severity s>
149  class LogWriter {
150  std::stringstream _message;
151  const std::chrono::high_resolution_clock::time_point _timestamp;
152  public:
153  LogWriter() : _timestamp(std::chrono::high_resolution_clock::now()) {};
155  LoggerImpl::get().log(LogMessage(_timestamp, s, _message.str()));
156  };
157 
162  template <typename T>
163  LogWriter& operator<< (const T& log_object) {
164  _message << log_object;
165  return *this;
166  }
167  };
168 
169 }
LogMessage(const std::chrono::high_resolution_clock::time_point t, const Severity s, const std::string &m)
Definition: logging.hpp:44
std::queue< LogMessage > _messages
Definition: logging.hpp:86
std::atomic_bool _running
Definition: logging.hpp:90
Definition: logging.hpp:27
Definition: logging.hpp:26
Definition: logging.hpp:30
static LoggerImpl & get()
Definition: logging.cpp:56
Definition: logging.cpp:9
std::condition_variable _cond
Definition: logging.hpp:88
const Severity _severity
Definition: logging.hpp:42
LoggerImpl()
Definition: logging.hpp:121
Definition: logging.hpp:40
const std::string severity_lines[]
Definition: logging.hpp:34
std::unique_ptr< std::thread > _writer
Definition: logging.hpp:89
LogWriter()
Definition: logging.hpp:153
Definition: logging.hpp:31
Definition: logging.hpp:85
Definition: logging.hpp:149
std::mutex _mutex
Definition: logging.hpp:87
void log(const LogMessage &&msg)
Definition: logging.cpp:11
Definition: logging.hpp:65
Severity
Definition: logging.hpp:25
~LoggerImpl()
Definition: logging.hpp:130
~LogWriter()
Definition: logging.hpp:154
Definition: logging.hpp:55
std::weak_ptr< LogSink > _sink
Definition: logging.hpp:92
unsigned int _log_repeat
Definition: logging.hpp:91
const std::chrono::high_resolution_clock::time_point _timestamp
Definition: logging.hpp:41
Definition: logging.hpp:29
Definition: logging.hpp:28
std::stringstream _message
Definition: logging.hpp:150
const std::string _message
Definition: logging.hpp:43
const std::chrono::high_resolution_clock::time_point _timestamp
Definition: logging.hpp:151