如果把 Zephyr 开发比作开车,那 Logging 就是你的仪表盘——没有它,你只能靠猜来排查问题。无论是定位 Bug、观察运行状态,还是分析通信数据,日志系统都是 Zephyr 开发者最得力的助手。本课将带你从零掌握 Logging 的核心用法,并亲手在 ESP32-S3 上跑通日志实验。
很好,来到第16课:Logging(日志系统)。
这一课非常重要,因为Zephyr 的调试几乎都依赖 Logging。学完以后,你会知道为什么官方代码几乎看不到 printf()。
摘要:本课系统讲解 Zephyr RTOS 的日志系统(Logging)。你将理解为什么 RTOS 中应避免使用 printf(),掌握 LOG_INF、LOG_ERR、LOG_WRN、LOG_DBG 等核心宏的用法,学会通过 prj.conf 配置日志等级、注册模块、使用 Deferred/Immediate 两种模式,并了解 Runtime Filter、RTT、多 Backend 等进阶特性。最后通过 ESP32-S3 上的动手实验,掌握日志等级过滤机制与 Zephyr 企业级日志规范,为后续学习 Shell、Bluetooth、Networking 等模块打下基础。
第16课:Logging(日志系统)
目标
学完本课,你将掌握:
为什么不用 printf()
Zephyr Logging 架构
LOG_INF、LOG_ERR 等宏
Runtime Log Level
Module Logging
Shell 查看日志
Logging Backend(UART、RTT)
Logging 最佳实践
一、为什么不用 printf()
很多初学者刚开始都是这样:
printf(“button pressed\n”);
但是在 RTOS 中,这样做会带来很多问题:
例如:
ISR │ ├── printf()│ ├── UART发送 │ ├── 等待FIFO │ └── CPU卡住printf:
很慢
阻塞
ISR 不能乱用
没有 Level
无法关闭
因此 Zephyr 推荐使用:
LOG_INF("Button pressed");Logging 的处理流程是:
LOG_INF()↓ 放入Log Buffer ↓ 后台线程输出 ↓ UART因此 Logging 具备以下优点:
不阻塞 更快 可以过滤 可以关闭 支持多Backend二、Logging架构
下面是 Deferred 模式下 Zephyr Logging 的完整数据流向: