现场问题最怕“设备有问题,但没有日志”。嵌入式设备的观测能力不需要一开始就复杂,但至少要能回答:设备是什么版本、发生过什么、当前状态如何、配置是什么、网络是否正常。
一、日志分层
建议分几类:
1 | system log |
常见目录:
1 | /data/log |
不要把长期日志写到 tmpfs,也不要无限写入 Flash。
二、日志格式
最小字段:
1 | time level module message |
更推荐:
1 | time level module request_id event result error_code message |
示例:
1 | 2026-06-26 21:53:33 INFO mqtt request_id=abc cmd=set_timezone result=ok |
现场排查时,request_id 可以把 MQTT 命令、业务执行和 ack 串起来。
三、日志轮转
基础策略:
1 | app.log |
控制:
- 单文件大小。
- 最大文件数量。
- 关键错误单独保存。
- debug 日志可动态打开。
不要让日志占满 /data,否则配置、OTA 状态都可能写不进去。
四、状态快照
可以提供脚本:
1 | /usr/bin/collect_support_bundle |
采集:
1 | date |
打包:
1 | tar czf /tmp/support_bundle.tar.gz /data/log /tmp/system_snapshot.txt |
这样现场人员可以一键导出问题包。
五、崩溃信息
如果空间允许,启用 core dump:
1 | ulimit -c unlimited |
也可以在应用崩溃时记录:
- 信号。
- 退出码。
- 版本。
- 最近配置。
- 最近关键日志。
不一定所有设备都适合保存 core,但至少要保存崩溃摘要。
六、观测能力验收
一台异常设备拿回来后,应该能回答:
- 固件版本是什么。
- 最近有没有重启。
- MQTT 是否连接过。
- 是否发生过 OTA。
- 当前配置是什么。
- 存储是否满了。
- 内核有没有错误日志。
能回答这些问题,排查效率会高很多。
- 本文链接: https://blog.hansong.icu/2026/06/26/Embedded_Linux_Series_16_Logging_Observability/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。