设为首页 加入收藏

TOP

第四部分:Spdlog日志库的核心组件分析-logger(一)
2023-07-23 13:34:27 】 浏览:62
Tags:Spdlog -logger

Spdlog是一个快速且可扩展的C++日志库,它支持多线程和异步日志记录。在本文中,我们将分析Spdlog日志库的核心代码,探究其实现原理和代码结构。

Spdlog的基本架构

上一篇文章介绍了spdlog的五个主要组件,其中最重要是Logger、Sink和Formatter其中,Logger负责日志的记录和管理,Sink负责将日志输出到不同的目标(比如控制台、文件、网络等),Formatter负责将日志格式化为字符串。我们会在下面详细的介绍下它们。

Logger

Logger是Spdlog日志库的核心组件,它负责记录和管理日志。Logger的定义如下:

class logger {
public:
    explicit logger(std::string logger_name, sinks_init_list sinks);

    template<typename T>
    void log(level::level_enum lvl, const T &msg);
    
		template<typename... Args>
    void log(source_loc loc, level::level_enum lvl, format_string_t<Args...> fmt, Args &&... args);
    
    template<typename... Args>
    void log(level::level_enum lvl, format_string_t<Args...> fmt, Args &&... args);
    
    // ...
    template<typename... Args>
    void trace(format_string_t<Args...> fmt, Args &&... args);
    
    template<typename... Args>
    void debug(format_string_t<Args...> fmt, Args &&... args);

    template<typename... Args>
    void info(format_string_t<Args...> fmt, Args &&... args);

    // ....

private:
    std::string name_;
    std::vector<sink_ptr> sinks_;
    // ...
};

Logger主要包含一个名称和一组Sink,它还提供了log()方法用于记录日志。当调用log()方法时,Logger会将日志消息传递给每个Sink,并由Sink将日志输出到目标。Logger还提供了其他一些方法,比如设置日志级别、添加和删除Sink等。

Logger 是个日志包装器,包含了日志名称和一组Sink,它提供了输出不同级别日志的方法,通过不同Sink的组合可以输出到一个或多个不同输出路径(文件,控制台,网络等)。

日志名全局唯一

每个 logger 都有一个名称,并且是全局唯一的,通过上一篇提到的 register 组件注册到全局的 map里,代码如下, registryloggers_ 字段通过名字记录了所有的 logger 实例。

class registry
{
public:
    // ..... 
    // 注册日志
	  void register_logger(std::shared_ptr<logger> new_logger);

 private:
  // ....
	std::unordered_map<std::string, std::shared_ptr<logger>> loggers_;
}

registry 提供 register_logger 接口注册日志。这里值得注意点是:注册时候如果发现已经存在则会抛异常, throw_if_exists_ 会检查是否已经存在同名日志实例,存在则通过 throw_spdlog_ex 抛出异常。

SPDLOG_INLINE void registry::throw_if_exists_(const std::string &logger_name)
{
    if (loggers_.find(logger_name) != loggers_.end())
    {
        throw_spdlog_ex("logger with name '" + logger_name + "' already exists");
    }
}

SPDLOG_INLINE void registry::register_logger_(std::shared_ptr<logger> new_logger)
{
    auto logger_name = new_logger->name();
    throw_if_exists_(logger_name);
    loggers_[logger_name] = std::move(new_logger);
}

日志输出控制

  • 提供不同级别日志的输出接口

logger 类中,Spdlog 提供了不同级别日志的输出接口,包括 trace()debug()info()warn()error()critical() 等。下面是 logger 类中提供的不同级别日志输出接口的代码示例:

template<typename... Args>
void trace(format_string_t<Args...> fmt, Args &&... args);

template<typename... Args>
void debug(format_string_t<Args...> fmt, Args &&... args);

template<typename... Args>
void info(format_string_t<Args...> fmt, Args &&... args);

template<typename... Args>
void warn(format_string_t<Args...> fmt, Args &&... args);

template<typename... Args>
void error(format_string_t<Args...> fmt, Args &&... args);

template<typename... Args>
void critical(format_string_t<Args...> fmt, Args &&... args);

使用这些接口,可以根据不同的日志级别输出不同的日志信息,比如 logger.info("This is an info message."); 将输出一条信息级别为 info 的日志。

  • 日志输出级别控制

logger

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++11:lambda匿名函数 下一篇【Visual Leak Detector】配置项 ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目