日志系统设计原则:日志级别、格式、轮转与存储架构
日志这东西,说简单也简单,说复杂真能坑死人。我见过太多ADAS项目,车跑着跑着日志把存储撑爆了,或者关键时刻查不到有效信息。今天咱们就把日志系统的四个核心原则掰开揉碎讲清楚。
一、日志级别定义:别什么都往里面塞
日志级别不是拍脑袋定的。我个人习惯用五个级别,每个级别都有明确的触发场景。
| 级别 | 名称 | 触发场景 | 颜色标记 |
|---|---|---|---|
| FATAL | 致命错误 | 系统无法继续运行,必须重启 | 红色背景 |
| ERROR | 错误 | 功能异常,但系统可降级运行 | 红色文字 |
| WARN | 警告 | 潜在风险,当前未触发 | 黄色 |
| INFO | 信息 | 关键状态变更、模块启停 | 白色 |
| DEBUG | 调试 | 开发阶段详细追踪 | 灰色 |
核心原则:生产环境只开INFO及以上级别。DEBUG日志只在开发板或模拟器上启用。
我在项目中遇到过一件事:某团队把所有传感器原始数据都打成了INFO日志。结果车跑半小时,日志文件涨到2GB。嗯,后来他们改成了DEBUG级别,问题就解决了。
二、日志格式规范:统一才能自动化
格式不统一,解析脚本就得写死你。我建议的格式长这样:
[2025-03-15 14:23:45.678] [INFO] [LIDAR_FUSION] [frame_id:1024] 目标检测完成,数量:12,耗时:23ms
拆开来看,每个字段都有讲究:
- 时间戳:精确到毫秒,用ISO 8601格式。别用本地时间,统一用UTC。
- 日志级别:大写固定宽度,方便grep过滤。
- 模块名:比如CAMERA、LIDAR、FUSION、PLANNING。我习惯用下划线连接。
- 上下文ID:比如frame_id、session_id。这是调试的救命稻草。
- 消息体:结构化数据,能用key:value就别用散文。
小技巧:在Python里用logging模块的Formatter,配合自定义Filter,可以轻松实现统一格式。别手写字符串拼接,容易漏字段。
三、日志轮转策略:别让日志吃掉磁盘
ADAS系统跑起来,日志生成速度惊人。我曾经见过一个项目,日志轮转没配好,跑了三天磁盘满了,系统直接挂掉。那叫一个惨。
我推荐的做法是:
- 按大小轮转:单个日志文件不超过100MB。超过就切分。
- 按时间轮转:每天生成一个新文件,不管大小。
- 保留策略:保留最近7天的日志,或者总大小不超过5GB。
- 压缩归档:超过3天的日志自动gzip压缩。
Python里用RotatingFileHandler和TimedRotatingFileHandler就能搞定。举个例子:
import logging
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler(
'adas.log',
maxBytes=100 * 1024 * 1024, # 100MB
backupCount=7
)
handler.setFormatter(logging.Formatter(
'[%(asctime)s] [%(levelname)s] [%(module)s] %(message)s'
))
注意:轮转时别直接删除旧文件。先重命名,再创建新文件。否则正在写入的句柄会出问题。我吃过这个亏。
四、日志存储架构:分层设计才靠谱
日志存储不能只想着写本地。ADAS系统有实时性要求,也有离线分析需求。我习惯分三层:
第一层:本地缓存
每个模块写自己的日志文件,存在本地SSD上。容量有限,只保留最近2小时的数据。为什么?因为车机存储空间金贵,而且SSD频繁写入会缩短寿命。
第二层:车载集中存储
所有模块的日志通过UDP或共享内存汇总到中央日志服务。中央服务负责轮转、压缩、上传。这里要注意网络丢包问题——我建议用UDP加序列号,丢了就丢了,别阻塞主流程。
第三层:云端存储
通过4G/5G上传关键日志到云端。上传策略是:
- ERROR和FATAL日志实时上传
- WARN日志每5分钟批量上传
- INFO日志只在停车后上传
- DEBUG日志不上传,除非手动触发
避坑指南:我曾经设计过一个方案,把所有日志都实时上传云端。结果车在隧道里没信号,日志队列越积越多,最后把内存撑爆了。后来改成分级上传,问题解决。
五、实战建议:从第一天就规划好
日志系统不是后期加的,是架构设计的一部分。我建议你:
- 先定义好日志级别和格式,写进团队编码规范
- 日志轮转策略在第一个版本就实现
- 存储架构要考虑带宽、延迟、成本三个维度
- 写一个日志查看工具,支持按级别、模块、时间范围过滤
说白了,日志系统就像汽车的仪表盘。平时你可能不看它,但出问题的时候,它是你唯一的救命稻草。别等到车在路上抛锚了,才发现日志系统没配好。
嗯,今天就聊到这儿。下一章咱们讲讲日志采集的具体实现,包括多线程安全、异步写入这些实战细节。