rea1m

日志该留多久

这个问题没有标准答案,但可以算。算清楚之后,大多数机器上默认的保留策略都是错的 —— 要么留太短查不到问题,要么留太长没人看还占满盘。

先算磁盘成本

取一个中等流量的站点,假设每天 50 万请求,日志格式是 combined(约 120 字节/行,加上压缩前的膨胀):

50 万 × 120 B ≈ 60 MB/天 ≈ 1.8 GB/月 ≈ 22 GB/年

40G 系统盘的机器上,一年不清理就会满。加上 gzip 压缩通常能到 1/8 到 1/10,也就是每月不到 200 MB —— 压缩与否差了一个数量级,这是第一个值得做的优化。

再算排查效率

日志的实际用途大致三类,各自对时间窗口的要求完全不同:

结论:业务机器的原始访问日志留 7-30 天足够。真要长期趋势,把聚合后的指标(每天请求数、状态码分布、P95 延迟)另存一份,体积小两个数量级。

journald 的几个坑

systemd 机器上的日志默认走 journald,它有几个容易漏掉的配置:

1. 默认不持久

很多发行版的默认值是 Storage=auto,含义是 "/var/log/journal 存在就持久化,不存在就只放内存"。全新安装的机器上这个目录往往不存在,于是重启日志全丢。

mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald

2. 上限是按目录算的

SystemMaxUse 限制的是整个 journal 目录,不是单个文件。设了 4G 意味着总量到 4G 才开始淘汰,单个文件可能很大。排查问题时按大小切分更容易处理:

[Journal]
SystemMaxUse=2G
SystemMaxFileSize=128M
MaxRetentionSec=30day

3. 有的服务不写 journal

nginx 默认写自己的文件(/var/log/nginx/*.log),不走 journald。这不冲突,但意味着你的日志分散在两个地方,做保留策略时要分别配。

一个实际的选择

我现在的做法:

最后一条值得展开:并不是所有日志都值得落盘。如果一份日志的用途只是"出问题时看一眼当前状态",那内存足够了,落到磁盘上反而是负担 —— 既是存储负担,也是信息暴露面。