异步日志方案spdlog

异步日志方案spdlog

spdlog 是一款高效的 C++ 日志库,它以其极高的性能零成本的抽象 而著称。spdlog 支持异步同步日志记录,提供多种日志级别,并允许用户将日志输出到控制台、文件或自定义的接收器。

  • 多线程使用和同步、异步日志没有关系
  • 是否在同一线程处理也和同步、异步日志没有关系
区别: spdlog::info()调用之后是否打印成功,如果调用到其他线程中打印则为异步日志。
  • 零成本抽象 :spdlog 通过模板和内联函数 来实现零成本抽象,
    确保只有在真正需要时才进行日志记录。
  • 异步日志记录 :spdlog 支持异步日志记录,这意味着它可以将
    日志消息发送到线程池进行处理,从而减少对主线程性能的影
    响。
  • 高效地格式化 :spdlog 使用 fmt 库进行高效的字符串格式化,
    减少了格式化日志消息所需的时间。

特征:

  • 极高的日志记录速度 : spdlog 能够在每秒记录数百万条日志消
    息,这对于需要处理大量日志数据的应用来说是非常重要的。
  • 低内存占用 : spdlog 的设计确保了即使在高负载下,它也能保持
    低内存占用。
  • 灵活的配置 : 用户可以根据需要配置 spdlog,选择异步或同步日
    志记录,以及选择不同的日志级别和输出目标。

输出控制:

  • 多种日志级别 : spdlog 支持多种日志级别,包括 trace、
    debug、info、warn、error 和 critical,用户可以根据需要选择
    合适的日志级别。
  • 多种输出目标 : 用户可以将日志输出到控制台、文件或通过网络
    发送到远程服务器。接收器
  • 格式化输出 : spdlog 支持格式化输出,允许用户以结构化的方式
    输出日志消息。

logger->log 在异步日志中仅仅是发布一个消息到线程池

默认的logger输出:stdout, colored, multithreaded

Loggers 负责记录日志消息,Sinks 决定了日志消息的输出位置,Formatters 负责将日志消息转换为特定格式,AsyncLogger 异步地将日志消息写入到目标 Sink 中,Registry 用于管理这些组件。

面试题:spdlog中的每一个logname对应一个shared_ptr吗?

在spdlog库中,每个日志记录器(logger)通常由一个shared_ptr管理。这意味着每个具有唯一名称(logname)的记录器都是通过一个shared_ptr来引用和管理的。这样做的好处是便于记录器的共享和自动管理内存。

当你创建一个记录器时,例如使用spdlog::get(name)spdlog::basic_logger_mt(name, filename),如果这个名字的记录器已经存在,spdlog将返回一个指向现有记录器的shared_ptr。如果记录器不存在,则会创建一个新的记录器,并以shared_ptr的形式返回。

这种设计允许多个部分的代码共享对同一个记录器的访问,而不需要担心何时释放相关资源,因为当最后一个shared_ptr被销毁时,记录器的内存将自动被释放。

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

相关推荐
uhakadotcom8 小时前
视频直播与视频点播:基础知识与应用场景
后端·面试·架构
拉不动的猪8 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪8 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
uhakadotcom9 小时前
快速开始使用 n8n
后端·面试·github
uhakadotcom9 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom9 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom9 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom10 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom10 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试
探索为何11 小时前
JWT与Session的实战选择-杂谈(1)
后端·面试