Toolbox snapshot
The Reactive C++ Toolbox
Loading...
Searching...
No Matches
Logger.hpp
Go to the documentation of this file.
1// The Reactive C++ Toolbox.
2// Copyright (C) 2013-2019 Swirly Cloud Limited
3// Copyright (C) 2022 Reactive Markets Limited
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16
17#ifndef TOOLBOX_SYS_LOGGER_HPP
18#define TOOLBOX_SYS_LOGGER_HPP
19
21#include <toolbox/sys/Time.hpp>
24
25#include <boost/lockfree/queue.hpp>
26#include <boost/lockfree/stack.hpp>
27
28#include <thread>
29
30namespace toolbox {
31inline namespace sys {
32
33class Logger;
34
35enum class LogLevel : int {
37 None,
39 Crit,
41 Error,
43 Warn,
45 Metric,
47 Notice,
49 Info,
51 Debug
52};
53
55inline constexpr std::size_t LogBufPoolCapacity = 64;
56using LogBufPool = boost::lockfree::stack<LogMsgPtr, boost::lockfree::capacity<LogBufPoolCapacity>>;
57
60
64
67
70
74
77
80
83
86{
87 return level <= get_log_level();
88}
89
92
95
97TOOLBOX_API Logger& set_logger(Logger& logger) noexcept;
98
103
107TOOLBOX_API void write_log(WallTime ts, LogLevel level, LogMsgPtr&& msg, std::size_t size) noexcept;
108
112 public:
113 Logger() noexcept = default;
114 virtual ~Logger();
115
116 // Copy.
117 Logger(const Logger&) noexcept = default;
118 Logger& operator=(const Logger&) noexcept = default;
119
120 // Move.
121 Logger(Logger&&) noexcept = default;
122 Logger& operator=(Logger&&) noexcept = default;
123
124 void write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr&& msg, std::size_t size,
125 bool warming_fake) noexcept
126 {
127 do_write_log(ts, level, tid, std::move(msg), size, warming_fake);
128 }
129
130 protected:
131 virtual void do_write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr&& msg,
132 std::size_t size, bool warming_fake) noexcept
133 = 0;
134};
135
137 struct Task {
138 WallTime ts;
139 LogLevel level;
140 int tid;
141 char* msg;
142 std::size_t size;
143 };
144
145 public:
146 explicit AsyncLogger(Logger& logger);
147 ~AsyncLogger() override;
148
149 // Copy.
150 AsyncLogger(const AsyncLogger&) = delete;
152
153 // Move.
156
159 bool run();
160
162 void stop();
163
164 private:
165 void write_all_messages();
166 void do_write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr&& msg,
167 std::size_t size, bool warming_fake) noexcept override;
168
169 Logger& logger_;
170 boost::lockfree::queue<Task, boost::lockfree::fixed_sized<false>> tq_{512};
171 std::atomic<bool> stop_{false};
172
173 // warming mode variables
174 std::atomic<int> fake_pushed_count_{0};
175 std::atomic<WallTime> last_time_fake_pushed_{};
176 static_assert(std::atomic<WallTime>::is_always_lock_free, "atomic not lock free");
177};
178
182 public:
183 explicit ScopedLogLevel(LogLevel level) noexcept
184 : prev_{set_log_level(level)}
185 {
186 }
188
189 // Copy.
192
193 // Move.
196
197 private:
198 const LogLevel prev_;
199};
200
204 public:
205 explicit ScopedLogger(Logger& logger) noexcept
206 : prev_{set_logger(logger)}
207 {
208 }
210
211 // Copy.
212 ScopedLogger(const ScopedLogger&) = delete;
214
215 // Move.
218
219 private:
220 Logger& prev_;
221};
222
223template <typename StreamT>
224 requires Streamable<StreamT>
226{
227 os << log_label(level);
228 return os;
229}
230
231} // namespace sys
232} // namespace toolbox
233
234#endif // TOOLBOX_SYS_LOGGER_HPP
#define TOOLBOX_API
Definition Config.h:39
AsyncLogger & operator=(AsyncLogger &&)=delete
AsyncLogger(const AsyncLogger &)=delete
AsyncLogger & operator=(const AsyncLogger &)=delete
AsyncLogger(AsyncLogger &&)=delete
virtual void do_write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr &&msg, std::size_t size, bool warming_fake) noexcept=0
Logger() noexcept=default
ScopedLogLevel(LogLevel level) noexcept
Definition Logger.hpp:183
ScopedLogLevel & operator=(ScopedLogLevel &&)=delete
ScopedLogLevel & operator=(const ScopedLogLevel &)=delete
ScopedLogLevel(const ScopedLogLevel &)=delete
ScopedLogLevel(ScopedLogLevel &&)=delete
ScopedLogger & operator=(const ScopedLogger &)=delete
ScopedLogger & operator=(ScopedLogger &&)=delete
ScopedLogger(const ScopedLogger &)=delete
ScopedLogger(ScopedLogger &&)=delete
ScopedLogger(Logger &logger) noexcept
Definition Logger.hpp:205
STL namespace.
ostream & operator<<(ostream &os, const pair< T, U > &p)
Definition Parser.ut.cpp:29
boost::lockfree::stack< LogMsgPtr, boost::lockfree::capacity< LogBufPoolCapacity > > LogBufPool
Definition Logger.hpp:56
bool is_log_level(LogLevel level) noexcept
Return true if level is less than or equal to current log level.
Definition Logger.hpp:85
const char * log_label(LogLevel level) noexcept
Return log label for given log level.
Definition Logger.cpp:217
Logger & set_logger(Logger &logger) noexcept
Set logger globally for all threads.
Definition Logger.cpp:237
Logger & get_logger() noexcept
Return current logger.
Definition Logger.cpp:232
void write_log(WallTime ts, LogLevel level, LogMsgPtr &&msg, std::size_t size) noexcept
Definition Logger.cpp:242
Logger & null_logger() noexcept
Null logger. This logger does nothing and is effectively /dev/null.
Definition Logger.cpp:202
WallClock::time_point WallTime
Definition Time.hpp:112
StoragePtr< MaxLogLine > LogMsgPtr
Definition Logger.hpp:54
bool log_warming_mode_enabled() noexcept
Returns true if log warming mode is enabled.
Definition Logger.cpp:197
LogLevel get_log_level() noexcept
Return current log level.
Definition Logger.cpp:222
LogBufPool & log_buf_pool() noexcept
A pool of log buffers, eliminating the need for dynamic memory allocations when logging.
Definition Logger.cpp:187
constexpr std::size_t LogBufPoolCapacity
Definition Logger.hpp:55
Logger & std_logger() noexcept
Definition Logger.cpp:207
LogLevel set_log_level(LogLevel level) noexcept
Set log level globally for all threads.
Definition Logger.cpp:227
void set_log_warming_mode(bool enabled) noexcept
Definition Logger.cpp:192
Logger & sys_logger() noexcept
System logger. This logger calls syslog().
Definition Logger.cpp:212
constexpr std::size_t size(const detail::Struct< detail::Member< TagsT, ValuesT >... > &s)
Definition Struct.hpp:98
std::unique_ptr< char[], detail::StorageDeleter< SizeN > > StoragePtr
Pointer to an uninitialised char array of SizeN, freed with delete[].
Definition Storage.hpp:33
constexpr auto bind() noexcept
Definition Slot.hpp:97