日志系统设计原则:日志级别、格式、轮转与存储架构

日志这东西,说简单也简单,说复杂真能坑死人。我见过太多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系统跑起来,日志生成速度惊人。我曾经见过一个项目,日志轮转没配好,跑了三天磁盘满了,系统直接挂掉。那叫一个惨。

我推荐的做法是:

  1. 按大小轮转:单个日志文件不超过100MB。超过就切分。
  2. 按时间轮转:每天生成一个新文件,不管大小。
  3. 保留策略:保留最近7天的日志,或者总大小不超过5GB。
  4. 压缩归档:超过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日志不上传,除非手动触发

避坑指南:我曾经设计过一个方案,把所有日志都实时上传云端。结果车在隧道里没信号,日志队列越积越多,最后把内存撑爆了。后来改成分级上传,问题解决。

五、实战建议:从第一天就规划好

日志系统不是后期加的,是架构设计的一部分。我建议你:

  • 先定义好日志级别和格式,写进团队编码规范
  • 日志轮转策略在第一个版本就实现
  • 存储架构要考虑带宽、延迟、成本三个维度
  • 写一个日志查看工具,支持按级别、模块、时间范围过滤

说白了,日志系统就像汽车的仪表盘。平时你可能不看它,但出问题的时候,它是你唯一的救命稻草。别等到车在路上抛锚了,才发现日志系统没配好。

嗯,今天就聊到这儿。下一章咱们讲讲日志采集的具体实现,包括多线程安全、异步写入这些实战细节。