spdlog
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 {
31namespace details {
32
34 : formatter_(new pattern_formatter())
35{
36
37#ifndef SPDLOG_DISABLE_DEFAULT_LOGGER
38 // create default logger (ansicolor_stdout_sink_mt or wincolor_stdout_sink_mt in windows).
39# ifdef _WIN32
41# else
43# endif
44
45 const char *default_logger_name = "";
46 default_logger_ = std::make_shared<spdlog::logger>(default_logger_name, std::move(color_sink));
47 loggers_[default_logger_name] = default_logger_;
48
49#endif // SPDLOG_DISABLE_DEFAULT_LOGGER
50}
51
53
59
61{
63 new_logger->set_formatter(formatter_->clone());
64
65 if (err_handler_)
66 {
67 new_logger->set_error_handler(err_handler_);
68 }
69
70 // set new level according to previously configured level or default level
71 auto it = log_levels_.find(new_logger->name());
72 auto new_level = it != log_levels_.end() ? it->second : global_log_level_;
73 new_logger->set_level(new_level);
74
75 new_logger->flush_on(flush_level_);
76
78 {
79 new_logger->enable_backtrace(backtrace_n_messages_);
80 }
81
83 {
84 register_logger_(std::move(new_logger));
85 }
86}
87
89{
91 auto found = loggers_.find(logger_name);
92 return found == loggers_.end() ? nullptr : found->second;
93}
94
100
101// Return raw ptr to the default logger.
102// To be used directly by the spdlog default api (e.g. spdlog::info)
103// This make the default API faster, but cannot be used concurrently with set_default_logger().
104// e.g do not call set_default_logger() from one thread while calling spdlog::info() from another.
109
110// set default logger.
111// default logger is stored in default_logger_ (for faster retrieval) and in the loggers_ map.
113{
115 // remove previous default logger from the map
116 if (default_logger_ != nullptr)
117 {
118 loggers_.erase(default_logger_->name());
119 }
120 if (new_default_logger != nullptr)
121 {
122 loggers_[new_default_logger->name()] = new_default_logger;
123 }
124 default_logger_ = std::move(new_default_logger);
125}
126
132
138
139// Set global formatter. Each sink in each logger will get a clone of this object
141{
143 formatter_ = std::move(formatter);
144 for (auto &l : loggers_)
145 {
146 l.second->set_formatter(formatter_->clone());
147 }
148}
149
151{
153 backtrace_n_messages_ = n_messages;
154
155 for (auto &l : loggers_)
156 {
157 l.second->enable_backtrace(n_messages);
158 }
159}
160
162{
165 for (auto &l : loggers_)
166 {
167 l.second->disable_backtrace();
168 }
169}
170
172{
174 for (auto &l : loggers_)
175 {
176 l.second->set_level(log_level);
177 }
178 global_log_level_ = log_level;
179}
180
182{
184 for (auto &l : loggers_)
185 {
186 l.second->flush_on(log_level);
187 }
188 flush_level_ = log_level;
189}
190
192{
194 auto clbk = [this]() { this->flush_all(); };
195 periodic_flusher_ = details::make_unique<periodic_worker>(clbk, interval);
196}
197
199{
201 for (auto &l : loggers_)
202 {
203 l.second->set_error_handler(handler);
204 }
205 err_handler_ = std::move(handler);
206}
207
209{
211 for (auto &l : loggers_)
212 {
213 fun(l.second);
214 }
215}
216
218{
220 for (auto &l : loggers_)
221 {
222 l.second->flush();
223 }
224}
225
227{
229 loggers_.erase(logger_name);
230 if (default_logger_ && default_logger_->name() == logger_name)
231 {
232 default_logger_.reset();
233 }
234}
235
242
243// clean all resources and threads started by the registry
245{
246 {
248 periodic_flusher_.reset();
249 }
250
251 drop_all();
252
253 {
255 tp_.reset();
256 }
257}
258
263
265{
267 automatic_registration_ = automatic_registration;
268}
269
271{
273 log_levels_ = std::move(levels);
274 auto global_level_requested = global_level != nullptr;
275 global_log_level_ = global_level_requested ? *global_level : global_log_level_;
276
277 for (auto &logger : loggers_)
278 {
279 auto logger_entry = log_levels_.find(logger.first);
280 if (logger_entry != log_levels_.end())
281 {
282 logger.second->set_level(logger_entry->second);
283 }
284 else if (global_level_requested)
285 {
286 logger.second->set_level(*global_level);
287 }
288 }
289}
290
292{
293 static registry s_instance;
294 return s_instance;
295}
296
298{
299 if (loggers_.find(logger_name) != loggers_.end())
300 {
301 throw_spdlog_ex("logger with name '" + logger_name + "' already exists");
302 }
303}
304
306{
307 auto logger_name = new_logger->name();
308 throw_if_exists_(logger_name);
309 loggers_[logger_name] = std::move(new_logger);
310}
311
312} // namespace details
313} // namespace spdlog
std::mutex logger_map_mutex_
Definition registry.h:95
std::shared_ptr< logger > default_logger()
level::level_enum flush_level_
Definition registry.h:101
void flush_on(level::level_enum log_level)
void set_formatter(std::unique_ptr< formatter > formatter)
void set_levels(log_levels levels, level::level_enum *global_level)
void flush_every(std::chrono::seconds interval)
void set_error_handler(err_handler handler)
void set_automatic_registration(bool automatic_registration)
std::recursive_mutex tp_mutex_
Definition registry.h:96
void set_tp(std::shared_ptr< thread_pool > tp)
std::recursive_mutex & tp_mutex()
void drop(const std::string &logger_name)
void register_logger_(std::shared_ptr< logger > new_logger)
std::shared_ptr< thread_pool > tp_
Definition registry.h:103
void set_default_logger(std::shared_ptr< logger > new_default_logger)
std::unique_ptr< periodic_worker > periodic_flusher_
Definition registry.h:104
std::shared_ptr< thread_pool > get_tp()
void throw_if_exists_(const std::string &logger_name)
std::unique_ptr< formatter > formatter_
Definition registry.h:99
static registry & instance()
spdlog::level::level_enum global_log_level_
Definition registry.h:100
void register_logger(std::shared_ptr< logger > new_logger)
std::unordered_map< std::string, std::shared_ptr< logger > > loggers_
Definition registry.h:97
void apply_all(const std::function< void(const std::shared_ptr< logger >)> &fun)
void enable_backtrace(size_t n_messages)
std::shared_ptr< logger > get(const std::string &logger_name)
std::shared_ptr< logger > default_logger_
Definition registry.h:105
void set_level(level::level_enum log_level)
std::mutex flusher_mutex_
Definition registry.h:95
void initialize_logger(std::shared_ptr< logger > new_logger)
void set_level(level::level_enum log_level)
Definition logger-inl.h:67
#define SPDLOG_INLINE
Definition common.h:33
T end(T... args)
T find(T... args)
T make_shared(T... args)
Definition async.h:25
SPDLOG_INLINE void throw_spdlog_ex(const std::string &msg, int last_errno)
Definition common-inl.h:68