注册表具有唯一标识,用于管理多个日志
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
#pragma once
// Loggers registry of unique name->logger pointer
// An attempt to create a logger with an already existing name will result with spdlog_ex exception.
// If user requests a non existing logger, nullptr will be returned
// This class is thread safe
#include <spdlog/common.h>
#include <spdlog/details/periodic_worker.h>
#include <chrono>
#include <functional>
#include <memory>
#include <string>
#include <unordered_map>
#include <mutex>
namespace spdlog {
class logger;
namespace details {
class thread_pool;
class SPDLOG_API registry
{
public:
using log_levels = std::unordered_map<std::string, level::level_enum>;
// 拷贝构造函数进行删除(delete)的声明。这意味着该类的拷贝构造函数被禁用,不允许进行拷贝构造。
registry(const registry &) = delete;
// 这意味着该类的赋值运算符重载被禁用,不允许进行对象之间的赋值操作。
registry &operator=(const registry &) = delete;
// 向全局的日志器注册表中注册一个新的日志器。
void register_logger(std::shared_ptr<logger> new_logger);
// 初始化一个新的日志器并将其设置为【全局默认日志器】。
void initialize_logger(std::shared_ptr<logger> new_logger);
// 通过名称获取logger
std::shared_ptr<logger> get(const std::string &logger_name);
// 获取默认的全局日志器。
std::shared_ptr<logger> default_logger();
// Return raw ptr to the default logger.
// To be used directly by the spdlog default api (e.g. spdlog::info)
// This make the default API faster, but cannot be used concurrently with set_default_logger().
// e.g do not call set_default_logger() from one thread while calling spdlog::info() from another.
// 获取默认的全局日志器的裸指针(raw pointer)。
// 裸指针是指向对象的普通指针,不包含智能指针的管理功能,需要手动管理对象的生命周期。
logger *get_default_raw();
// set default logger.
// default logger is stored in default_logger_ (for faster retrieva l) and in the loggers_ map.
// 设置新的默认全局日志器
void set_default_logger(std::shared_ptr<logger> new_default_logger);
// 设置日志器的线程池。
// 通过设置日志器的线程池,可以让日志器在后台线程中执行写入日志的操作,从而减少主线程的阻塞时间,提高程序的性能和响应性。
// 如果日志记录是同步进行的(默认情况下),日志消息的写入操作会在主线程中直接完成,可能会对程序的性能产生影响。
// 而设置了线程池后,日志消息的写入操作将在后台线程中进行,不会阻塞主线程的执行。
void set_tp(std::shared_ptr<thread_pool> tp);
// 获取线程池
std::shared_ptr<thread_pool> get_tp();
// Set global formatter. Each sink in each logger will get a clone of this object
// 设置日志器的日志消息格式化器
// 日志消息格式化器是用于将日志消息的内容按照特定的格式进行格式化的组件
// 通过设置日志器的格式化器,可以自定义日志消息输出的样式,例如包含时间戳、日志级别、日志内容等信息,并将格式化后的日志消息写入到输出目标(如控制台、文件等)。
void set_formatter(std::unique_ptr<formatter> formatter);
// 启用日志器的回溯(backtrace)功能。
void enable_backtrace(size_t n_messages);
// 关闭日志器的回溯(backtrace)功能。
void disable_backtrace();
// 设置日志的级别
void set_level(level::level_enum log_level);
// 日志器的日志刷新级别。
// 日志刷新级别指定了日志器在哪个日志级别及以上时需要立即刷新日志消息。
// 如果调用 flush_on(spdlog::level::err),它会设置日志器在 err(错误)级别及以上时立即刷新日志消息。
// 这意味着处于 err、critical 和 off 级别的日志消息将在写入后立即刷新,而低于这些级别的日志消息(例如 info 或 debug)可能会被缓冲以提高效率。
void flush_on(level::level_enum log_level);
// 设置定时刷新日志的时间间隔。
// 支持不同类型的时间间隔。Rep 和 Period 是时间间隔类型的模板参数,用于指定时间间隔的数值和时间单位。
// std::chrono::duration 是 C++ 标准库中的时间间隔类模板,用于表示一段时间。
// std::lock_guard<std::mutex> lock(flusher_mutex_);这是一个互斥锁 std::mutex 的锁保护,用于保证在设置定时