常见的开源的C++ log库基本比较
特性/库 |
spdlog |
log4cplus |
|
配置文件灵活度 |
支持通过代码配置,不依赖于外部文件配置。 |
需要通过命令行参数或环境变量配置。 |
支持通过外部配置文件灵活配置。 |
接口扩展性 |
提供丰富的API,易于扩展。 |
提供基础的日志记录功能,扩展性一般。 |
提供可扩展的接口和插件机制。 |
定制化程度 |
支持高度定制化,自定义日志格式和筛选机制。 |
支持基本的日志格式定制。 |
提供高度定制化的日志格式和筛选机制。 |
日志机制 |
高效的异步日志记录机制。 |
同步日志记录,性能较高。 |
支持同步和异步日志记录。 |
特有优势 |
轻量,高性能,支持多种日志输出方式。 |
错误时有堆栈输出功能,简单易用,适合Google系的项目。 |
功能全面,适合需要详细日志配置的大型项目。 |
日志相关的规则
特性/库 |
spdlog |
glog |
log4cplus |
输出规则 |
支持多种日志接收器,包括文件、控制台等。 |
默认输出到控制台,可以配置为文件输出。 |
支持多种输出目的地,包括文件、控制台等。 |
默认输出格式 |
日期、时间、日志级别和消息内容。 |
时间戳、日志级别、线程ID、文件名和行号。 |
日期、时间、日志级别、线程ID和消息内容。 |
生成规则 |
支持自动日志轮转,基于文件大小或时间。 |
支持基于时间的日志轮转。 |
支持基于文件大小和时间的日志轮转。 |
清理规则 |
可配置最大文件数量,超过则自动删除旧文件。 |
通常需要手动管理旧文件,或使用外部脚本。 |
支持配置最大备份文件数量,自动删除旧文件。 |
前缀规则 |
可以自定义,无默认前缀。 |
通常包括日志级别的缩写。 |
可以自定义,无默认前缀。 |
文件名规则 |
可以自定义,无默认规则。 |
默认包括程序名、主机名、用户名和时间戳。 |
可以自定义,无默认规则。 |
开源日志库底层打印原理
- spdlog
- 底层打印原理:
spdlog
使用了高效的缓冲机制,它利用了C++11的特性,如模板、lambda表达式和移动语义来提高性能。此外,spdlog
支持同步和异步日志记录,其中异步记录通过使用环形缓冲区和专用的日志记录线程来实现。
- glog
- 底层打印原理:
glog
,也就是Google Logging Library,主要使用了同步日志记录方式。它直接将日志消息写入到磁盘或其他输出流中。glog
更注重简单和直接的实现,不像spdlog
那样提供广泛的性能优化选项。
- log4cplus
- 底层打印原理:
log4cplus
是基于经典的log4j
框架的C++实现。它提供了同步和异步日志记录机制。在异步模式下,log4cplus
使用队列和工作线程来处理日志消息,从而减少了对主执行线程的影响。
结论
- Glog 限制性比较大,日志生成规则、清理规则、输出格式规则 都不太友好,同时不支持异步。
- spdlog比较轻量,同时性能较高。相对来说需要更多的二次封装工作。
- 需要定制配置文件。
- 需要自定义筛选器来实现自定义筛选机制。
- 需要自定义输出器来实现自定义输出格式。
- log4cplus的配置文件支持直接修改自定义的输出格式,支持自定义的筛选机制,但是只能在内定的规则内(通常是够用的)。