spdlog日志管理库详细介绍与项目落地分析
·
1. spdlog简介
spdlog 是现代 C++ 高性能日志库,特点:
- 高性能
- 支持 header-only 或编译库模式
- 支持同步/异步日志
- 支持多线程 logger
- 支持控制台、文件、滚动文件输出
- 支持自定义日志格式
核心结构:
spdlog
├── logger 日志器
├── sink 输出目标
├── formatter 格式化器
├── level 日志等级
├── async 异步日志
└── flush 刷盘管理
2. Logger
Logger 是日志核心对象。
示例:
auto logger = spdlog::stdout_color_mt("livox");
logger->info("Livox Mid360 start");
logger->warn("Heartbeat timeout");
logger->error("Device open failed");
工程中建议每个模块使用独立 logger:
livox_logger
camera_logger
control_logger
system_logger
3. Sink
Sink 表示日志输出位置。
常见类型:
Sink 功能
stdout_color_sink_mt 控制台输出
basic_file_sink_mt 文件输出
rotating_file_sink_mt 按大小滚动
daily_file_sink_mt 按日期切分
syslog_sink_mt Linux系统日志
典型机器人项目:
日志
|
+-- 控制台
|
+-- 文件
|
+-- 系统日志
4. 文件滚动日志
推荐:
auto logger =
spdlog::rotating_logger_mt(
"robot",
"logs/robot.log",
20*1024*1024,
10
);
含义:
- 单文件20MB
- 保留10个历史文件
适合:
- 雷达驱动
- 相机驱动
- 自动驾驶节点
5. 日志格式
推荐:
logger->set_pattern(
"[%Y-%m-%d %H:%M:%S.%e] [%n] [%^%l%$] [tid:%t] %v"
);
输出:
[2026-07-08 10:30:10.123]
[livox]
[INFO]
[tid:1234]
Radar started
包含:
- 时间
- 模块
- 等级
- 线程
- 内容
6. 日志等级
spdlog:
trace
debug
info
warn
error
critical
off
建议:
场景 等级
初始化成功 INFO
普通状态 DEBUG
异常恢复 WARN
设备失败 ERROR
系统无法运行 CRITICAL
7. 异步日志
同步:
业务线程
|
写文件
|
返回
异步:
业务线程
|
日志队列
|
后台线程写文件
优点:
- 不阻塞控制线程
- 适合高频数据系统
适合:
- 点云
- 图像
- SLAM
- AI推理
8. sirius_log封装建议
不要业务代码直接依赖spdlog。
推荐:
sirius_log
|
+-- spdlog
|
+-- 配置文件
|
+-- 宏封装
例如:
#define SIRIUS_INFO(...)
#define SIRIUS_WARN(...)
#define SIRIUS_ERROR(...)
业务:
SIRIUS_INFO("Livox Mid360 started");
SIRIUS_ERROR("Open device failed");
以后替换日志库无需修改业务代码。
9. ROS2项目落地
推荐架构:
robot_system
├── sirius_log
│
├── sirius_config
│
├── livox_mid360
│
├── camera_driver
│
└── control_node
底层:
spdlog
ROS接口:
RCLCPP_INFO
分层使用。
10. 优点
高性能
适合:
- 机器人
- 自动驾驶
- 实时感知
功能丰富
支持:
- 文件
- 滚动
- 异步
- 多线程
易封装
可以形成企业统一日志系统:
业务代码
|
sirius_log
|
spdlog
调试方便
可以快速定位:
- 时间
- 线程
- 模块
- 错误位置
11. 缺点
1. 异步日志可能丢日志
队列满时需要选择:
- block
- overrun_oldest
2. 需要管理生命周期
退出前:
spdlog::shutdown();
3. 高频打印影响性能
错误:
while(true)
{
SPDLOG_INFO("receive packet");
}
应该:
SPDLOG_DEBUG("receive packet");
4. ROS2存在日志重复问题
需要明确:
- ROS层使用RCLCPP
- 底层库使用spdlog
12. 推荐机器人项目配置
spdlog
+
sirius_log封装
+
yaml配置
+
rotating_file_sink
+
async logger
+
error自动flush
适用于:
- Livox Mid360
- 相机驱动
- SLAM
- AI推理服务
- ROS2机器人系统
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)