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机器人系统
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐