第2章:日志基础——分类、结构、常见格式及对存储成本的影响

做日志成本控制,第一步不是去搞压缩、调轮转,而是先把咱们手里的日志“看清楚”。说白了,你连存的是什么、长什么样都不知道,优化的方向大概率是歪的。这一章我就带你把日志的底裤扒干净。

一、先给日志分个类

我习惯把日志分成这么几大类,每类的“烧钱”程度完全不一样。

分类 典型来源 特点 成本敏感度
系统日志 OS、内核、systemd 文本为主,量稳定,行数固定 低
应用日志 业务代码、中间件 格式多样,量大且随时间波动 极高
安全日志 WAF、IPS、审计 结构清晰,必须完整保留 中
网络日志 交换机、负载均衡 字段固定,但每秒可能上万条 高
访问日志 Nginx、API网关 K/V结构明显,可压缩率很高 中高

你想想看,应用日志和网络日志经常是成本的大头。我优化过一个电商平台的日志系统,访问日志占了总存储量的60%以上。嗯,这里要注意,并不是所有日志都值得原样存下来。

省钱第一课:分类是你决定“砍谁”的依据。系统日志,保留天数可以短一些;应用日志里的DEBUG级别,线上环境能不能干脆不落盘?这是我常在团队里问的一个问题。

二、解析日志的结构

日志的结构决定了你解析它的开销,以及最终落盘的大小。说穿了就两种:固定长度和可变长度。

1. 固定长度结构

每个字段占的字节是定好的。比如一个时间戳14字节、一个IP 15字节。简单粗暴,解析飞快,但浪费空间。一个很短的数值也得按最大长度撑开。

2. 可变长度结构

现在的主流。字段用分隔符或标签隔开,每个字段实际多长就多长。解析稍微费点CPU,但空间利用率高。

我接手的项目里,有人用纯文本写了非常长的错误堆栈。你知道一条堆栈可能上万个字符吗?而且每行都重复了相同的类名。这种日志结构要是没控制好,存储成本直接起飞。

避坑指南(我曾经):曾经有个服务,日志里每条都打印了完整的HTTP请求体,包括base64的图片数据。一条日志几百KB。他们还没意识到问题,直到我计算了一下:每天1亿条请求,每天产生的日志量超过10TB,仅仅是因为日志结构里塞了不该塞的东西。

三、聊聊常见格式:JSON、纯文本、还有别的

格式这东西,直接影响你的存储效率和查询速度。我个人在制定日志规范时很少允许团队用纯文本,除非是临时调试。

JSON格式

可读性强,易于解析和嵌套。缺点也很明显:开销大。

{
    "time": "2024-03-15 10:00:00",
    "level": "ERROR",
    "service": "user-svc",
    "message": "数据库连接超时",
    "request_id": "abc-123",
    "duration_ms": 30012
}

这个例子,有效数据大概60个字符,但加上JSON的key、引号、冒号、花括号,实际存储量增加了近一倍。你想想看,每天存几亿条,多出来的全是钱。

文本格式(非结构化)

长得像这样:

2024-03-15 10:00:00 ERROR [user-svc] 数据库连接超时 | req_id=abc-123 | dur=30012ms

没有冗余的key,体积比JSON小了三分之一左右。但是解析起来费劲,按字段搜索得靠正则或分词,CPU开销又上去了。

其他格式(如Apache格式、Protobuf、Avro)

这些一般用于内部传输或特殊中间件。Protobuf二进制格式确实小,但调试时你基本没法直接看。要不要用,得看你们的运维工具链跟不跟得上。

从成本角度看,JSON存储成本高但查询成本低;纯文本存储成本低但查询成本高。怎么选?说白了,看你们哪项成本更敏感。

四、理解格式对存储成本的实际影响

我拿真实的业务场景给你算一笔账。假设有100GB原始日志数据:

格式 原始体积 压缩后体积(gzip) 索引后体积(ES) 月成本估算(按冷存储)
纯文本 100 GB 15 GB — ¥150
JSON紧凑 130 GB 20 GB 60 GB ¥300
JSON标准 160 GB 25 GB 80 GB ¥500

我建议,线上服务日志统一采用“紧凑JSON”或“结构化文本”格式。就是去掉没必要的空格、缩短key名,比如把service_name写成svc,duration_ms写成dur。别小看这点改动,每秒千万级写入时,一天能省下几个GB。

个人技巧:我自己写了一个小linter,提交日志格式的代码变更时自动检查:有没有冗余key?是否可控?有没有意外加入的base64大字段?像这种前置检查,通常能堵住80%的成本浪费。

五、完整知识结构图

下面这张图可以帮你理清日志基础知识与存储成本之间的对应关系。只有从分类、结构到格式都理解到位了,后面的压缩、轮转、冷热分离才有扎实的根据。

日志基础知识与成本影响链路 日志分类(五大来源) 系统日志 应用日志 安全日志 网络日志 访问日志 日志结构(两种类型) 固定长度结构 可变长度结构 常见格式(四种主流) JSON(标准/紧凑) 纯文本/非结构 Apache格式 二进制/Protobuf 对存储成本的直接与间接影响 分类决定保留策略与淘汰优先级

搞清楚了这些基础,后面咱们聊压缩策略、冷热分离、索引优化才算是站在同一起跑线上。我个人回头看,当初在这个章节上花时间做梳理,是成本控制课程里最值的一笔投资。