Photon 1.0.0
Loading...
Searching...
No Matches
registry-inl.h
Go to the documentation of this file.
1// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
2// Distributed under the MIT License (http://opensource.org/licenses/MIT)
3
4#pragma once
5
6#ifndef SPDLOG_HEADER_ONLY
8#endif
9
10#include <spdlog/common.h>
12#include <spdlog/logger.h>
14
15#ifndef SPDLOG_DISABLE_DEFAULT_LOGGER
16// support for the default stdout color logger
17#ifdef _WIN32
19#else
21#endif
22#endif // SPDLOG_DISABLE_DEFAULT_LOGGER
23
24#include <chrono>
25#include <functional>
26#include <memory>
27#include <string>
28#include <unordered_map>
29
30namespace spdlog
31{
32 namespace details
33 {
34
36 : formatter_(new pattern_formatter())
37 {
38
39#ifndef SPDLOG_DISABLE_DEFAULT_LOGGER
40 // create default logger (ansicolor_stdout_sink_mt or wincolor_stdout_sink_mt in windows).
41#ifdef _WIN32
42 auto color_sink = std::make_shared<sinks::wincolor_stdout_sink_mt>();
43#else
44 auto color_sink = std::make_shared<sinks::ansicolor_stdout_sink_mt>();
45#endif
46
47 const char* default_logger_name = "";
48 default_logger_ = std::make_shared<spdlog::logger>(default_logger_name, std::move(color_sink));
49 loggers_[default_logger_name] = default_logger_;
50
51#endif // SPDLOG_DISABLE_DEFAULT_LOGGER
52 }
53
55
56 SPDLOG_INLINE void registry::register_logger(std::shared_ptr<logger> new_logger)
57 {
58 std::lock_guard<std::mutex> lock(logger_map_mutex_);
59 register_logger_(std::move(new_logger));
60 }
61
62 SPDLOG_INLINE void registry::initialize_logger(std::shared_ptr<logger> new_logger)
63 {
64 std::lock_guard<std::mutex> lock(logger_map_mutex_);
65 new_logger->set_formatter(formatter_->clone());
66
67 if (err_handler_)
68 {
69 new_logger->set_error_handler(err_handler_);
70 }
71
72 // set new level according to previously configured level or default level
73 auto it = log_levels_.find(new_logger->name());
74 auto new_level = it != log_levels_.end() ? it->second : global_log_level_;
75 new_logger->set_level(new_level);
76
77 new_logger->flush_on(flush_level_);
78
80 {
81 new_logger->enable_backtrace(backtrace_n_messages_);
82 }
83
85 {
86 register_logger_(std::move(new_logger));
87 }
88 }
89
90 SPDLOG_INLINE std::shared_ptr<logger> registry::get(const std::string& logger_name)
91 {
92 std::lock_guard<std::mutex> lock(logger_map_mutex_);
93 auto found = loggers_.find(logger_name);
94 return found == loggers_.end() ? nullptr : found->second;
95 }
96
97 SPDLOG_INLINE std::shared_ptr<logger> registry::default_logger()
98 {
99 std::lock_guard<std::mutex> lock(logger_map_mutex_);
100 return default_logger_;
101 }
102
103 // Return raw ptr to the default logger.
104 // To be used directly by the spdlog default api (e.g. spdlog::info)
105 // This make the default API faster, but cannot be used concurrently with set_default_logger().
106 // e.g do not call set_default_logger() from one thread while calling spdlog::info() from another.
111
112 // set default logger.
113 // default logger is stored in default_logger_ (for faster retrieval) and in the loggers_ map.
114 SPDLOG_INLINE void registry::set_default_logger(std::shared_ptr<logger> new_default_logger)
115 {
116 std::lock_guard<std::mutex> lock(logger_map_mutex_);
117 // remove previous default logger from the map
118 if (default_logger_ != nullptr)
119 {
120 loggers_.erase(default_logger_->name());
121 }
122 if (new_default_logger != nullptr)
123 {
124 loggers_[new_default_logger->name()] = new_default_logger;
125 }
126 default_logger_ = std::move(new_default_logger);
127 }
128
129 SPDLOG_INLINE void registry::set_tp(std::shared_ptr<thread_pool> tp)
130 {
131 std::lock_guard<std::recursive_mutex> lock(tp_mutex_);
132 tp_ = std::move(tp);
133 }
134
135 SPDLOG_INLINE std::shared_ptr<thread_pool> registry::get_tp()
136 {
137 std::lock_guard<std::recursive_mutex> lock(tp_mutex_);
138 return tp_;
139 }
140
141 // Set global formatter. Each sink in each logger will get a clone of this object
142 SPDLOG_INLINE void registry::set_formatter(std::unique_ptr<formatter> formatter)
143 {
144 std::lock_guard<std::mutex> lock(logger_map_mutex_);
145 formatter_ = std::move(formatter);
146 for (auto& l : loggers_)
147 {
148 l.second->set_formatter(formatter_->clone());
149 }
150 }
151
153 {
154 std::lock_guard<std::mutex> lock(logger_map_mutex_);
155 backtrace_n_messages_ = n_messages;
156
157 for (auto& l : loggers_)
158 {
159 l.second->enable_backtrace(n_messages);
160 }
161 }
162
164 {
165 std::lock_guard<std::mutex> lock(logger_map_mutex_);
167 for (auto& l : loggers_)
168 {
169 l.second->disable_backtrace();
170 }
171 }
172
174 {
175 std::lock_guard<std::mutex> lock(logger_map_mutex_);
176 for (auto& l : loggers_)
177 {
178 l.second->set_level(log_level);
179 }
180 global_log_level_ = log_level;
181 }
182
184 {
185 std::lock_guard<std::mutex> lock(logger_map_mutex_);
186 for (auto& l : loggers_)
187 {
188 l.second->flush_on(log_level);
189 }
190 flush_level_ = log_level;
191 }
192
194 {
195 std::lock_guard<std::mutex> lock(logger_map_mutex_);
196 for (auto& l : loggers_)
197 {
198 l.second->set_error_handler(handler);
199 }
200 err_handler_ = std::move(handler);
201 }
202
203 SPDLOG_INLINE void registry::apply_all(const std::function<void(const std::shared_ptr<logger>)>& fun)
204 {
205 std::lock_guard<std::mutex> lock(logger_map_mutex_);
206 for (auto& l : loggers_)
207 {
208 fun(l.second);
209 }
210 }
211
213 {
214 std::lock_guard<std::mutex> lock(logger_map_mutex_);
215 for (auto& l : loggers_)
216 {
217 l.second->flush();
218 }
219 }
220
221 SPDLOG_INLINE void registry::drop(const std::string& logger_name)
222 {
223 std::lock_guard<std::mutex> lock(logger_map_mutex_);
224 loggers_.erase(logger_name);
225 if (default_logger_ && default_logger_->name() == logger_name)
226 {
227 default_logger_.reset();
228 }
229 }
230
232 {
233 std::lock_guard<std::mutex> lock(logger_map_mutex_);
234 loggers_.clear();
235 default_logger_.reset();
236 }
237
238 // clean all resources and threads started by the registry
240 {
241 {
242 std::lock_guard<std::mutex> lock(flusher_mutex_);
243 periodic_flusher_.reset();
244 }
245
246 drop_all();
247
248 {
249 std::lock_guard<std::recursive_mutex> lock(tp_mutex_);
250 tp_.reset();
251 }
252 }
253
254 SPDLOG_INLINE std::recursive_mutex& registry::tp_mutex()
255 {
256 return tp_mutex_;
257 }
258
259 SPDLOG_INLINE void registry::set_automatic_registration(bool automatic_registration)
260 {
261 std::lock_guard<std::mutex> lock(logger_map_mutex_);
262 automatic_registration_ = automatic_registration;
263 }
264
266 {
267 std::lock_guard<std::mutex> lock(logger_map_mutex_);
268 log_levels_ = std::move(levels);
269 auto global_level_requested = global_level != nullptr;
270 global_log_level_ = global_level_requested ? *global_level : global_log_level_;
271
272 for (auto& logger : loggers_)
273 {
274 auto logger_entry = log_levels_.find(logger.first);
275 if (logger_entry != log_levels_.end())
276 {
277 logger.second->set_level(logger_entry->second);
278 }
279 else if (global_level_requested)
280 {
281 logger.second->set_level(*global_level);
282 }
283 }
284 }
285
287 {
288 static registry s_instance;
289 return s_instance;
290 }
291
292 SPDLOG_INLINE void registry::apply_logger_env_levels(std::shared_ptr<logger> new_logger)
293 {
294 std::lock_guard<std::mutex> lock(logger_map_mutex_);
295 auto it = log_levels_.find(new_logger->name());
296 auto new_level = it != log_levels_.end() ? it->second : global_log_level_;
297 new_logger->set_level(new_level);
298 }
299
300 SPDLOG_INLINE void registry::throw_if_exists_(const std::string& logger_name)
301 {
302 if (loggers_.find(logger_name) != loggers_.end())
303 {
304 throw_spdlog_ex("logger with name '" + logger_name + "' already exists");
305 }
306 }
307
308 SPDLOG_INLINE void registry::register_logger_(std::shared_ptr<logger> new_logger)
309 {
310 auto logger_name = new_logger->name();
311 throw_if_exists_(logger_name);
312 loggers_[logger_name] = std::move(new_logger);
313 }
314
315 } // namespace details
316} // namespace spdlog
Definition registry.h:30
std::mutex logger_map_mutex_
Definition registry.h:105
std::shared_ptr< logger > default_logger()
Definition registry-inl.h:97
level::level_enum flush_level_
Definition registry.h:111
size_t backtrace_n_messages_
Definition registry.h:117
bool automatic_registration_
Definition registry.h:116
void flush_on(level::level_enum log_level)
Definition registry-inl.h:183
void set_formatter(std::unique_ptr< formatter > formatter)
Definition registry-inl.h:142
void drop_all()
Definition registry-inl.h:231
void set_levels(log_levels levels, level::level_enum *global_level)
Definition registry-inl.h:265
void set_error_handler(err_handler handler)
Definition registry-inl.h:193
void set_automatic_registration(bool automatic_registration)
Definition registry-inl.h:259
std::recursive_mutex tp_mutex_
Definition registry.h:106
logger * get_default_raw()
Definition registry-inl.h:107
void set_tp(std::shared_ptr< thread_pool > tp)
Definition registry-inl.h:129
void apply_logger_env_levels(std::shared_ptr< logger > new_logger)
Definition registry-inl.h:292
std::recursive_mutex & tp_mutex()
Definition registry-inl.h:254
void drop(const std::string &logger_name)
Definition registry-inl.h:221
void register_logger_(std::shared_ptr< logger > new_logger)
Definition registry-inl.h:308
void disable_backtrace()
Definition registry-inl.h:163
std::shared_ptr< thread_pool > tp_
Definition registry.h:113
void set_default_logger(std::shared_ptr< logger > new_default_logger)
Definition registry-inl.h:114
log_levels log_levels_
Definition registry.h:108
std::unique_ptr< periodic_worker > periodic_flusher_
Definition registry.h:114
std::shared_ptr< thread_pool > get_tp()
Definition registry-inl.h:135
void throw_if_exists_(const std::string &logger_name)
Definition registry-inl.h:300
std::unordered_map< std::string, level::level_enum > log_levels
Definition registry.h:32
std::unique_ptr< formatter > formatter_
Definition registry.h:109
static registry & instance()
Definition registry-inl.h:286
spdlog::level::level_enum global_log_level_
Definition registry.h:110
void shutdown()
Definition registry-inl.h:239
void register_logger(std::shared_ptr< logger > new_logger)
Definition registry-inl.h:56
void flush_all()
Definition registry-inl.h:212
std::unordered_map< std::string, std::shared_ptr< logger > > loggers_
Definition registry.h:107
void apply_all(const std::function< void(const std::shared_ptr< logger >)> &fun)
Definition registry-inl.h:203
void enable_backtrace(size_t n_messages)
Definition registry-inl.h:152
std::shared_ptr< logger > get(const std::string &logger_name)
Definition registry-inl.h:90
std::shared_ptr< logger > default_logger_
Definition registry.h:115
err_handler err_handler_
Definition registry.h:112
void set_level(level::level_enum log_level)
Definition registry-inl.h:173
registry()
Definition registry-inl.h:35
std::mutex flusher_mutex_
Definition registry.h:105
void initialize_logger(std::shared_ptr< logger > new_logger)
Definition registry-inl.h:62
Definition formatter.h:13
Definition logger.h:56
void set_level(level::level_enum log_level)
Definition logger-inl.h:65
Definition pattern_formatter.h:79
#define SPDLOG_INLINE
Definition common.h:47
level_enum
Definition common.h:233
Definition async.h:26
std::function< void(const std::string &err_msg)> err_handler
Definition common.h:138
SPDLOG_INLINE void throw_spdlog_ex(const std::string &msg, int last_errno)
Definition common-inl.h:75
annotation details
Definition tag_strings.h:125