4. 日志存储与管理:日志轮转、日志压缩、日志归档策略

日志存着存着,磁盘就爆了。这事儿我碰过不止一次。

最惨的一次,FTP的vsftpd日志直接把根分区写满了。业务停了半小时,老板拍桌子,我背锅。从那以后,我养成了一个习惯——不管项目多急,先把日志轮转配好,再谈别的。

这一章,说白了就是告诉你:日志不能只写不删,也不能只删不存。轮转、压缩、归档,三个动作必须串成一条策略线。

核心目标:保证日志永不丢失,同时磁盘永远不爆。

4.1 日志轮转:什么时候该切,切多块

日志轮转是按时间或大小把当前日志文件“切”成新文件,旧文件保留或删除。别等着你自己手动去删,那太原始了。

我个人习惯用 logrotate,Linux 上标配。配置文件在 /etc/logrotate.conf,每个服务的规则放在 /etc/logrotate.d/ 下。

实战中我是这么配 FTP 日志轮转的:

/var/log/vsftpd.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root utmp
    postrotate
        /usr/bin/killall -HUP vsftpd 2>/dev/null || true
    endscript
}

简单解释几个关键参数:

  • daily:每天轮转一次。你也可以设 weekly 或 size 100M。
  • rotate 7:保留最近 7 份轮转后的日志。多了占地方,少了没回溯。
  • compress:旧日志自动 gzip 压缩。
  • delaycompress:压缩延迟一次。这招很实用——昨天切的日志今天才压,防止正在写的进程出问题。

我的小技巧:轮转后一定要发 SIGHUP 信号。vsftpd 默认不自动切文件,不重启进程的话日志会写进被重命名的旧文件,你就什么都查不到了。

4.2 日志压缩:存储空间是靠压出来的

轮转后的日志随便一个纯文本可能上百兆。不压缩,档案馆能让你塞爆。

我建议在 logrotate 里直接加 compress 选项,默认用 gzip,压缩率一般在 80% 以上。100MB 的原日志能压到 10MB 左右。

压缩工具 压缩率(典型) CPU 开销 解压速度
gzip 70%~90% 低 快
bzip2 80%~95% 中 中等
xz 90%~98% 高 慢
zstd 75%~92% 低(可调) 极快

生产环境我推荐 gzip 或 zstd。zstd 可以调压缩等级,对 FTP 日志这种重复性高的文本效果很好。

注意!压缩前的日志不要直接覆盖原文件。logrotate 默认改名后再压缩,不会丢数据。别自己写脚本暴力压缩正在写的日志,否则文件变 0 字节你就哭了。

4.3 日志归档:该搬走的就搬走

日志在磁盘上轮转保留一段时间后,就得往冷存储搬。这是归档。

我的经验是:线上磁盘保留 30 天轮转日志,超过 30 天的打包归档到 NAS 或对象存储(比如 S3、MinIO)。归档命名规则一定要统一,否则你找日志的时候会疯。

推荐一个归档文件名格式:

vsftpd-2025-04-01.log.gz
vsftpd-2025-04-02.log.gz

归档策略表(根据业务规模调整):

存储层级 保留期限 内容 说明
热存储(SSD) 当前 + 最近 30 天 轮转后未压缩 / 已压缩 日常查询用,响应要快
温存储(HDD) 31~180 天 gzip 压缩归档 合规审计,偶尔翻查
冷存储(磁带/对象存储) 181 天以上 xz 或 gzip 压缩包 法律取证,极少访问

归档脚本的要点:一是要 atomic,要么全成功,要么不动原文件;二是要做校验,归档后比对 md5,防止数据损坏。

4.4 三种策略怎么搭配

我总结了一条经验流:

  1. 轮转:每天按 size 或时间切一次,本机留 7~30 份。
  2. 压缩:延迟压缩,轮转后隔天再压,保证进程不影响。
  3. 归档:本机保存时间到了就 rsync/cp 到远程存储,然后清理本地。

血泪教训:我曾经只做了轮转没做归档。结果 200 台服务器的 FTP 日志堆了半年,一个 raid5 挂了就全没了。现在我的策略里必须有一条「本地副本不可靠,异地归档是底线」。

FTP日志存储与流转策略 FTP 实时日志 (vsftpd.log) ① 按日/大小轮转 ② 延迟压缩 (gzip/zstd) 热存储 (SSD·30天) 温存储 (HDD·180天) 冷存储 (对象存储/磁带) 箭头方向:日志数据流,不可逆

4.5 避坑清单(我踩过的)

  • 轮转后忘了发信号——日志一直写旧文件,新文件是空的。排查问题时什么都看不到。
  • 压缩等级设太高——xz -9 压一个100MB日志用了5分钟,CPU直接100%。日常用gzip -6或zstd -3就够了。
  • 归档没做 md5——有一次硬盘静默坏道,归档文件全是坏数据,还好本地副本没删。
  • 权限没保持一致——logrotate用root创建的新日志,vsftpd进程写不了,日志直接断流。

生产建议:先在小流量机器上跑一周logrotate,确认所有参数都正常,再批量推。我吃过批量上线的亏,结果每台机器的轮转脚本都出了不同的问题…