诸暨麻将添加redis
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

285 řádky
7.5 KiB

  1. // Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
  2. // Distributed under the MIT License (http://opensource.org/licenses/MIT)
  3. #pragma once
  4. #ifndef SPDLOG_HEADER_ONLY
  5. #include <spdlog/details/registry.h>
  6. #endif
  7. #include <spdlog/common.h>
  8. #include <spdlog/details/periodic_worker.h>
  9. #include <spdlog/logger.h>
  10. #include <spdlog/details/pattern_formatter.h>
  11. #ifndef SPDLOG_DISABLE_DEFAULT_LOGGER
  12. // support for the default stdout color logger
  13. #ifdef _WIN32
  14. #include <spdlog/sinks/wincolor_sink.h>
  15. #else
  16. #include <spdlog/sinks/ansicolor_sink.h>
  17. #endif
  18. #endif // SPDLOG_DISABLE_DEFAULT_LOGGER
  19. #include <chrono>
  20. #include <functional>
  21. #include <memory>
  22. #include <string>
  23. #include <unordered_map>
  24. namespace spdlog {
  25. namespace details {
  26. SPDLOG_INLINE registry::registry()
  27. : formatter_(new pattern_formatter())
  28. {
  29. #ifndef SPDLOG_DISABLE_DEFAULT_LOGGER
  30. // create default logger (ansicolor_stdout_sink_mt or wincolor_stdout_sink_mt in windows).
  31. #ifdef _WIN32
  32. auto color_sink = std::make_shared<sinks::wincolor_stdout_sink_mt>();
  33. #else
  34. auto color_sink = std::make_shared<sinks::ansicolor_stdout_sink_mt>();
  35. #endif
  36. const char *default_logger_name = "";
  37. default_logger_ = std::make_shared<spdlog::logger>(default_logger_name, std::move(color_sink));
  38. loggers_[default_logger_name] = default_logger_;
  39. #endif // SPDLOG_DISABLE_DEFAULT_LOGGER
  40. }
  41. SPDLOG_INLINE void registry::register_logger(std::shared_ptr<logger> new_logger)
  42. {
  43. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  44. register_logger_(std::move(new_logger));
  45. }
  46. SPDLOG_INLINE void registry::initialize_logger(std::shared_ptr<logger> new_logger)
  47. {
  48. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  49. new_logger->set_formatter(formatter_->clone());
  50. if (err_handler_)
  51. {
  52. new_logger->set_error_handler(err_handler_);
  53. }
  54. new_logger->set_level(level_);
  55. new_logger->flush_on(flush_level_);
  56. if (backtrace_n_messages_ > 0)
  57. {
  58. new_logger->enable_backtrace(backtrace_n_messages_);
  59. }
  60. if (automatic_registration_)
  61. {
  62. register_logger_(std::move(new_logger));
  63. }
  64. }
  65. SPDLOG_INLINE std::shared_ptr<logger> registry::get(const std::string &logger_name)
  66. {
  67. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  68. auto found = loggers_.find(logger_name);
  69. return found == loggers_.end() ? nullptr : found->second;
  70. }
  71. SPDLOG_INLINE std::shared_ptr<logger> registry::default_logger()
  72. {
  73. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  74. return default_logger_;
  75. }
  76. // Return raw ptr to the default logger.
  77. // To be used directly by the spdlog default api (e.g. spdlog::info)
  78. // This make the default API faster, but cannot be used concurrently with set_default_logger().
  79. // e.g do not call set_default_logger() from one thread while calling spdlog::info() from another.
  80. SPDLOG_INLINE logger *registry::get_default_raw()
  81. {
  82. return default_logger_.get();
  83. }
  84. // set default logger.
  85. // default logger is stored in default_logger_ (for faster retrieval) and in the loggers_ map.
  86. SPDLOG_INLINE void registry::set_default_logger(std::shared_ptr<logger> new_default_logger)
  87. {
  88. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  89. // remove previous default logger from the map
  90. if (default_logger_ != nullptr)
  91. {
  92. loggers_.erase(default_logger_->name());
  93. }
  94. if (new_default_logger != nullptr)
  95. {
  96. loggers_[new_default_logger->name()] = new_default_logger;
  97. }
  98. default_logger_ = std::move(new_default_logger);
  99. }
  100. SPDLOG_INLINE void registry::set_tp(std::shared_ptr<thread_pool> tp)
  101. {
  102. std::lock_guard<std::recursive_mutex> lock(tp_mutex_);
  103. tp_ = std::move(tp);
  104. }
  105. SPDLOG_INLINE std::shared_ptr<thread_pool> registry::get_tp()
  106. {
  107. std::lock_guard<std::recursive_mutex> lock(tp_mutex_);
  108. return tp_;
  109. }
  110. // Set global formatter. Each sink in each logger will get a clone of this object
  111. SPDLOG_INLINE void registry::set_formatter(std::unique_ptr<formatter> formatter)
  112. {
  113. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  114. formatter_ = std::move(formatter);
  115. for (auto &l : loggers_)
  116. {
  117. l.second->set_formatter(formatter_->clone());
  118. }
  119. }
  120. SPDLOG_INLINE void registry::enable_backtrace(size_t n_messages)
  121. {
  122. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  123. backtrace_n_messages_ = n_messages;
  124. for (auto &l : loggers_)
  125. {
  126. l.second->enable_backtrace(n_messages);
  127. }
  128. }
  129. SPDLOG_INLINE void registry::disable_backtrace()
  130. {
  131. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  132. backtrace_n_messages_ = 0;
  133. for (auto &l : loggers_)
  134. {
  135. l.second->disable_backtrace();
  136. }
  137. }
  138. SPDLOG_INLINE void registry::set_level(level::level_enum log_level)
  139. {
  140. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  141. for (auto &l : loggers_)
  142. {
  143. l.second->set_level(log_level);
  144. }
  145. level_ = log_level;
  146. }
  147. SPDLOG_INLINE void registry::flush_on(level::level_enum log_level)
  148. {
  149. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  150. for (auto &l : loggers_)
  151. {
  152. l.second->flush_on(log_level);
  153. }
  154. flush_level_ = log_level;
  155. }
  156. SPDLOG_INLINE void registry::flush_every(std::chrono::seconds interval)
  157. {
  158. std::lock_guard<std::mutex> lock(flusher_mutex_);
  159. std::function<void()> clbk = std::bind(&registry::flush_all, this);
  160. periodic_flusher_ = details::make_unique<periodic_worker>(clbk, interval);
  161. }
  162. SPDLOG_INLINE void registry::set_error_handler(void (*handler)(const std::string &msg))
  163. {
  164. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  165. for (auto &l : loggers_)
  166. {
  167. l.second->set_error_handler(handler);
  168. }
  169. err_handler_ = handler;
  170. }
  171. SPDLOG_INLINE void registry::apply_all(const std::function<void(const std::shared_ptr<logger>)> &fun)
  172. {
  173. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  174. for (auto &l : loggers_)
  175. {
  176. fun(l.second);
  177. }
  178. }
  179. SPDLOG_INLINE void registry::flush_all()
  180. {
  181. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  182. for (auto &l : loggers_)
  183. {
  184. l.second->flush();
  185. }
  186. }
  187. SPDLOG_INLINE void registry::drop(const std::string &logger_name)
  188. {
  189. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  190. loggers_.erase(logger_name);
  191. if (default_logger_ && default_logger_->name() == logger_name)
  192. {
  193. default_logger_.reset();
  194. }
  195. }
  196. SPDLOG_INLINE void registry::drop_all()
  197. {
  198. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  199. loggers_.clear();
  200. default_logger_.reset();
  201. }
  202. // clean all resources and threads started by the registry
  203. SPDLOG_INLINE void registry::shutdown()
  204. {
  205. {
  206. std::lock_guard<std::mutex> lock(flusher_mutex_);
  207. periodic_flusher_.reset();
  208. }
  209. drop_all();
  210. {
  211. std::lock_guard<std::recursive_mutex> lock(tp_mutex_);
  212. tp_.reset();
  213. }
  214. }
  215. SPDLOG_INLINE std::recursive_mutex &registry::tp_mutex()
  216. {
  217. return tp_mutex_;
  218. }
  219. SPDLOG_INLINE void registry::set_automatic_registration(bool automatic_registration)
  220. {
  221. std::lock_guard<std::mutex> lock(logger_map_mutex_);
  222. automatic_registration_ = automatic_registration;
  223. }
  224. SPDLOG_INLINE registry &registry::instance()
  225. {
  226. static registry s_instance;
  227. return s_instance;
  228. }
  229. SPDLOG_INLINE void registry::throw_if_exists_(const std::string &logger_name)
  230. {
  231. if (loggers_.find(logger_name) != loggers_.end())
  232. {
  233. SPDLOG_THROW(spdlog_ex("logger with name '" + logger_name + "' already exists"));
  234. }
  235. }
  236. SPDLOG_INLINE void registry::register_logger_(std::shared_ptr<logger> new_logger)
  237. {
  238. auto logger_name = new_logger->name();
  239. throw_if_exists_(logger_name);
  240. loggers_[logger_name] = std::move(new_logger);
  241. }
  242. } // namespace details
  243. } // namespace spdlog