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
20#include <boost/lockfree/queue.hpp>
21#include <thread>
22
24#include <toolbox/sys/Time.hpp>
27
28namespace toolbox {
29inline namespace sys {
30
31class Logger;
32
33enum class LogLevel : int {
35 None,
37 Crit,
39 Error,
41 Warn,
43 Metric,
45 Notice,
47 Info,
49 Debug
50};
51
53
56
60
63
66
69
72{
73 return level <= get_log_level();
74}
75
78
81
83TOOLBOX_API Logger& set_logger(Logger& logger) noexcept;
84
89
93TOOLBOX_API void write_log(WallTime ts, LogLevel level, LogMsgPtr&& msg, std::size_t size) noexcept;
94
98 public:
99 Logger() noexcept = default;
100 virtual ~Logger();
101
102 // Copy.
103 Logger(const Logger&) noexcept = default;
104 Logger& operator=(const Logger&) noexcept = default;
105
106 // Move.
107 Logger(Logger&&) noexcept = default;
108 Logger& operator=(Logger&&) noexcept = default;
109
110 void write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr&& msg, std::size_t size) noexcept
111 {
112 do_write_log(ts, level, tid, std::move(msg), size);
113 }
114
115 protected:
116 virtual void do_write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr&& msg,
117 std::size_t size) noexcept
118 = 0;
119};
120
122 struct Task {
123 WallTime ts;
124 LogLevel level;
125 int tid;
126 void* msg;
127 std::size_t size;
128 };
129
130 public:
131 explicit AsyncLogger(Logger& logger);
132 ~AsyncLogger() override;
133
134 // Copy.
135 AsyncLogger(const AsyncLogger&) = delete;
137
138 // Move.
141
144 bool run();
145
147 void stop();
148
149 private:
150 void write_all_messages();
151 void do_write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr&& msg,
152 std::size_t size) noexcept override;
153
154 Logger& logger_;
155 boost::lockfree::queue<Task, boost::lockfree::fixed_sized<true>> tq_{512};
156 std::atomic<bool> stop_{false};
157};
158
162 public:
163 explicit ScopedLogLevel(LogLevel level) noexcept
164 : prev_{set_log_level(level)}
165 {
166 }
168
169 // Copy.
172
173 // Move.
176
177 private:
178 const LogLevel prev_;
179};
180
184 public:
185 explicit ScopedLogger(Logger& logger) noexcept
186 : prev_{set_logger(logger)}
187 {
188 }
190
191 // Copy.
192 ScopedLogger(const ScopedLogger&) = delete;
194
195 // Move.
198
199 private:
200 Logger& prev_;
201};
202
203template <typename StreamT>
204 requires Streamable<StreamT>
206{
207 os << log_label(level);
208 return os;
209}
210
211} // namespace sys
212} // namespace toolbox
213
214#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
Logger() noexcept=default
virtual void do_write_log(WallTime ts, LogLevel level, int tid, LogMsgPtr &&msg, std::size_t size) noexcept=0
ScopedLogLevel(LogLevel level) noexcept
Definition Logger.hpp:163
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:185
STL namespace.
ostream & operator<<(ostream &os, const pair< T, U > &p)
Definition Parser.ut.cpp:29
bool is_log_level(LogLevel level) noexcept
Return true if level is less than or equal to current log level.
Definition Logger.hpp:71
const char * log_label(LogLevel level) noexcept
Return log label for given log level.
Definition Logger.cpp:169
Logger & set_logger(Logger &logger) noexcept
Set logger globally for all threads.
Definition Logger.cpp:189
Logger & get_logger() noexcept
Return current logger.
Definition Logger.cpp:184
void write_log(WallTime ts, LogLevel level, LogMsgPtr &&msg, std::size_t size) noexcept
Definition Logger.cpp:194
Logger & null_logger() noexcept
Null logger. This logger does nothing and is effectively /dev/null.
Definition Logger.cpp:154
WallClock::time_point WallTime
Definition Time.hpp:111
StoragePtr< MaxLogLine > LogMsgPtr
Definition Logger.hpp:52
LogLevel get_log_level() noexcept
Return current log level.
Definition Logger.cpp:174
Logger & std_logger() noexcept
Definition Logger.cpp:159
LogLevel set_log_level(LogLevel level) noexcept
Set log level globally for all threads.
Definition Logger.cpp:179
Logger & sys_logger() noexcept
System logger. This logger calls syslog().
Definition Logger.cpp:164
constexpr std::size_t size(const detail::Struct< detail::Member< TagsT, ValuesT >... > &s)
Definition Struct.hpp:98
std::unique_ptr< void, detail::StorageDeleter< SizeN > > StoragePtr
Definition Storage.hpp:34
constexpr auto bind() noexcept
Definition Slot.hpp:92