异步日志方案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