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
111 public:
112 Logger() noexcept = default;
113 virtual ~Logger();
114
115 // Copy.
116 Logger(const Logger&) noexcept = default;
117 Logger& operator=(const Logger&) noexcept = default;
118
119 // Move.
120 Logger(Logger&&) noexcept = default;
121 Logger& operator=(Logger&&) noexcept = default;
122
123 void write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr&& msg, std::size_t size,
124 bool warming_fake) noexcept
125 {
126 do_write_log(ts, level, tid, std::move(msg), size, warming_fake);
127 }
128
129 protected:
130 virtual void do_write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr&& msg,
131 std::size_t size, bool warming_fake) noexcept
132 = 0;
133};
134
136 struct Task {
137 WallTime ts;
138 LogLevel level;
139 int tid;
140 char* msg;
141 std::size_t size;
142 };
143
144 public:
145 explicit AsyncLogger(Logger& logger);
146 ~AsyncLogger() override;
147
148 // Copy.
149 AsyncLogger(const AsyncLogger&) = delete;
151
152 // Move.
155
158 bool run();
159
161 void stop();
162
163 private:
164 void write_all_messages();
165 void do_write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr&& msg,
166 std::size_t size, bool warming_fake) noexcept override;
167
168 Logger& logger_;
169 boost::lockfree::queue<Task, boost::lockfree::fixed_sized<false>> tq_{512};
170 std::atomic<bool> stop_{false};
171
172 // warming mode variables
173 std::atomic<int> fake_pushed_count_{0};
174 std::atomic<WallTime> last_time_fake_pushed_{};
175 static_assert(std::atomic<WallTime>::is_always_lock_free, "atomic not lock free");
176};
177
181 public:
182 explicit ScopedLogLevel(LogLevel level) noexcept
183 : prev_{set_log_level(level)}
184 {
185 }
187
188 // Copy.
191
192 // Move.
195
196 private:
197 const LogLevel prev_;
198};
199
203 public:
204 explicit ScopedLogger(Logger& logger) noexcept
205 : prev_{set_logger(logger)}
206 {
207 }
209
210 // Copy.
211 ScopedLogger(const ScopedLogger&) = delete;
213
214 // Move.
217
218 private:
219 Logger& prev_;
220};
221
222template <typename StreamT>
223 requires Streamable<StreamT>
225{
226 os << log_label(level);
227 return os;
228}
229
230} // namespace sys
231} // namespace toolbox
232
233#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
The Logger is implemented by types that write log messages to a sink.
Definition Logger.hpp:110
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:182
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:204
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:113
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