第三部分:Spdlog 日志库的实现原理|环球观察

! https://zhuanlan.zhihu.com/p/617432495

Spdlog 是一个快速、异步的 C++ 日志库,被广泛应用于 C++ 项目中。在这篇文章中,我们将探讨 Spdlog 日志库的实现原理。

Spdlog 的结构

Spdlog 由五个主要组件构成:Loggers、Sinks、Formatters、Async Logger 和 Registry。每个组件都扮演着不同的角色,共同协作记录并输出日志消息。

Loggers:是 Spdlog 最基本的组件,负责记录日志消息。在 Spdlog 中,一个 Logger 对象代表着一个日志记录器,应用程序可以使用 Logger 对象记录不同级别的日志消息。Sinks:决定了日志消息的输出位置。在 Spdlog 中,一个 Sink 对象代表着一个输出位置,例如控制台、文件、网络等。应用程序可以将不同的日志消息发送到不同的 Sink 中。Formatters:负责将日志消息转换为特定格式。在 Spdlog 中,一个 Formatter 对象代表着一个消息格式器,应用程序可以使用不同的 Formatter 对象将日志消息转换为不同的格式。Async Logger:是 Spdlog 的异步记录器,它负责将日志消息异步地写入到目标 Sink 中。当应用程序调用 Logger 对象记录一个日志消息时,该消息会被加入到一个队列中,然后异步地写入目标 Sink 中。这样可以避免多个线程同时访问 Sink,从而确保线程安全性。Registry:用于管理 Spdlog 的所有组件。在 Spdlog 中,所有的 Loggers、Sinks、Formatters 和 Async Logger 都在一个全局注册表中注册,Registry 用于管理这些组件。Spdlog 记录日志的流程

当应用程序调用 Spdlog 记录日志时,Spdlog 的流程如下:


(相关资料图)

获取一个 Logger 对象。使用该 Logger 对象记录一个日志消息,该消息包括日志级别、时间戳、线程 ID、文件名和行号等信息。将日志消息传递给 Formatter,将消息转换为特定格式。将格式化后的消息传递给 Async Logger。Async Logger 将消息写入目标 Sink,完成日志记录。

Spdlog 的流程非常简单,但是每个组件都扮演着重要的角色。Loggers 负责记录日志消息,Sinks 决定了日志消息的输出位置,Formatters 负责将日志消息转换为特定格式,Async Logger 异步地将日志消息写入到目标 Sink 中,Registry 用于管理这些组件。

Spdlog 的线程安全性

spdlog 允许我们自由创建线程安全和非线程安全(单线程)的日志,其设置在基类base_skin中,

templateclass SPDLOG_API base_sink : public sink{public:    void log(const details::log_msg &msg) final;protected:    Mutex mutex_;}templatevoid SPDLOG_INLINE spdlog::sinks::base_sink::log(const details::log_msg &msg){    std::lock_guard lock(mutex_);    sink_it_(msg);}

每个sink都会继承 base_sink,通过模板参数 Mutex传入锁。可以看到写日志函数 log调用了 std::lock_guard来使用锁。

Mutex可以自定义,需要提供下面两个接口:

void lock();void unlock();

在实际使用中如果想要线程安全,可以传入c++的 mutex(c++11开始支持),也可以自定义。如下是一个声明线程安全例子:

using kafka_sink_mt = kafka_sink;

当然spdlog 也为我们提供了单线程的 mutex:

struct null_mutex{    void lock() const {}    void unlock() const {}};using kafka_sink_st = kafka_sink;
Spdlog 的同步和异步模式同步模式

在同步模式下,Spdlog 将日志消息直接写入目标 Sink,不使用内存队列。这种模式下,应用程序在记录日志消息时,必须等待消息写入目标 Sink 后才能继续执行。同步模式可以保证日志消息的实时性,但是可能会影响程序的性能,特别是在大量记录日志消息时。如果应用程序不需要实时记录日志消息,可以使用异步模式来提高性能。

异步模式

在异步模式下,日志消息被加入到一个内存队列中,然后异步地写入目标 Sink。异步模式可以提高日志记录的性能,尤其是在多线程环境下,因为它可以避免多个线程同时访问 Sink,从而提高线程安全性。

在 Spdlog 中,异步模式由 Async Logger 实现。Async Logger 在后台运行一个线程,负责从内存队列中获取日志消息,并将其写入目标 Sink 中。Async Logger 可以配置多个 Sink,每个 Sink 都会有一个独立的内存队列。

Spdlog 提供了两种内存队列实现:unbounded 和 bounded。unbounded 内存队列没有大小限制,可以一直增长,直到内存耗尽。bounded 内存队列有一个固定的大小,超过大小限制后,新的消息将被丢弃。

在使用异步模式时,需要注意以下事项:

处理内存队列时可能会出现内存分配问题和锁竞争问题,需要谨慎设计和测试。如果内存队列大小有限制,需要根据应用程序的需求和硬件资源进行适当的调整。在应用程序退出时,需要等待所有日志消息写入完成,否则可能会丢失一些日志消息。

异步模式可以大大提高日志记录的性能,但是也需要谨慎使用和测试。如果内存队列大小限制不当或处理不当,可能会导致内存占用过高或日志消息丢失等问题。

Spdlog 的性能

Spdlog 是一个高性能的日志库,它的性能优于其他许多日志库。Spdlog 的异步记录器和多线程支持使得它能够快速地记录大量的日志消息。

下面是spdlog性能:

同步模式:

[info] **************************************************************[info] Single thread, 1,000,000 iterations[info] **************************************************************[info] basic_st         Elapsed: 0.17 secs        5,777,626/sec[info] rotating_st      Elapsed: 0.18 secs        5,475,894/sec[info] daily_st         Elapsed: 0.20 secs        5,062,659/sec[info] empty_logger     Elapsed: 0.07 secs       14,127,300/sec[info] **************************************************************[info] C-string (400 bytes). Single thread, 1,000,000 iterations[info] **************************************************************[info] basic_st         Elapsed: 0.41 secs        2,412,483/sec[info] rotating_st      Elapsed: 0.72 secs        1,389,196/sec[info] daily_st         Elapsed: 0.42 secs        2,393,298/sec[info] null_st          Elapsed: 0.04 secs       27,446,957/sec[info] **************************************************************[info] 10 threads, competing over the same logger object, 1,000,000 iterations[info] **************************************************************[info] basic_mt         Elapsed: 0.60 secs        1,659,613/sec[info] rotating_mt      Elapsed: 0.62 secs        1,612,493/sec[info] daily_mt         Elapsed: 0.61 secs        1,638,305/sec[info] null_mt          Elapsed: 0.16 secs        6,272,758/sec

异步模式:

[info] -------------------------------------------------[info] Messages     : 1,000,000[info] Threads      : 10[info] Queue        : 8,192 slots[info] Queue memory : 8,192 x 272 = 2,176 KB [info] -------------------------------------------------[info] [info] *********************************[info] Queue Overflow Policy: block[info] *********************************[info] Elapsed: 1.70784 secs     585,535/sec[info] Elapsed: 1.69805 secs     588,910/sec[info] Elapsed: 1.7026 secs      587,337/sec[info] [info] *********************************[info] Queue Overflow Policy: overrun[info] *********************************[info] Elapsed: 0.372816 secs    2,682,285/sec[info] Elapsed: 0.379758 secs    2,633,255/sec[info] Elapsed: 0.373532 secs    2,677,147/sec

关键词:

第三部分:Spdlog 日志库的实现原理|环球观察

!https: zhuanlan zhihu com p 617432495Spdlog是一个快速、异步的C++日志库,被广泛应用于C++项目中。在这篇文章中,我们将探讨Spdlo

博客园 2023-03-27

天语SX4手动变速箱实物解剖手机实拍图

v :*{behavior:url( default VML);}o :*{behavior:url( defaul

互联网 2023-03-27

大金重工于宁波新设子公司,含海上风电相关系统研发业务|实时

企查查APP显示,近日,宁波金胤重工科技有限公司成立,注册资本5000万元人民币,经营范围包含:海洋工程装备研发;海上风电相关系统研发;风电

云财经 2023-03-27

全球热资讯!制止餐饮浪费纳入饭店业信用评价国家标准

据央视新闻,市场监管总局(标准委)近期批准发布《饭店业信用等级评价规范》,从推动行业高质量发展出发,构建了包含综合素质、财务状况、管理

证券时报网 2023-03-27

天天关注:长城汽车股价连跌转债即将下修背后:基本盘丢失 高端化之路折戟

出品:新浪财经上市公司研究院作者:昊长城汽车股价大跌即将引发连锁反应。3月22日,长城汽车发布《关于“长汽转债”预计满足转股价格向下修正

新浪证券 2023-03-27

全球观热点:月经期间可以吃红枣吗_月经期间可以吃桂圆吗

1、病情分析:桂圆是一种保健水果,属于温性水果。2、具有一定的活血化瘀、滋阴补血的作用。3、宫寒痛经患者,经期可以吃桂圆

互联网 2023-03-27

大学生心理健康状况调查出炉!升学成最大风险因素-环球观点

大学生心理健康状况调查出炉!升学成最大风险因素--教育--人民网日前,中国科学院心理研究所、社会科学文献出版社联合发布我

中国网 2023-03-27

第三部分:Spdlog 日志库的实现原理|环球观察

!https: zhuanlan zhihu com p 617432495Spdlog是一个快速、异步的C++日志库,被广泛应用于C++项目中。在这篇文章中,我们将探讨Spdlo

博客园 2023-03-27

天语SX4手动变速箱实物解剖手机实拍图

v :*{behavior:url( default VML);}o :*{behavior:url( defaul

互联网 2023-03-27

大金重工于宁波新设子公司,含海上风电相关系统研发业务|实时

企查查APP显示,近日,宁波金胤重工科技有限公司成立,注册资本5000万元人民币,经营范围包含:海洋工程装备研发;海上风电相关系统研发;风电

云财经 2023-03-27

全球热资讯!制止餐饮浪费纳入饭店业信用评价国家标准

据央视新闻,市场监管总局(标准委)近期批准发布《饭店业信用等级评价规范》,从推动行业高质量发展出发,构建了包含综合素质、财务状况、管理

证券时报网 2023-03-27

天天关注:长城汽车股价连跌转债即将下修背后:基本盘丢失 高端化之路折戟

出品:新浪财经上市公司研究院作者:昊长城汽车股价大跌即将引发连锁反应。3月22日,长城汽车发布《关于“长汽转债”预计满足转股价格向下修正

新浪证券 2023-03-27

全球观热点:月经期间可以吃红枣吗_月经期间可以吃桂圆吗

1、病情分析:桂圆是一种保健水果,属于温性水果。2、具有一定的活血化瘀、滋阴补血的作用。3、宫寒痛经患者,经期可以吃桂圆

互联网 2023-03-27

大学生心理健康状况调查出炉!升学成最大风险因素-环球观点

大学生心理健康状况调查出炉!升学成最大风险因素--教育--人民网日前,中国科学院心理研究所、社会科学文献出版社联合发布我

中国网 2023-03-27
x 广告
x 广告
x 广告

Copyright   2015-2022 华东仓储网版权所有  备案号:京ICP备2022016840号-41   联系邮箱:2 913 236 @qq.com