网站跑了一段时间后,很多人会把注意力放在内容、链接和抓取数据上,却很少去看服务器上那些一直在增长的日志文件。访问日志、错误日志、应用日志、定时任务输出,每天都会写入,单看一个文件不大,积累几个月就可能占用几个 GB,甚至把磁盘写满。磁盘一旦没有剩余空间,数据库无法写入、Web 服务无法记录会话、临时文件创建失败,严重时连远程登录都会受影响。
日志为什么会失控
常见原因有几个:一是根本没有配置轮转,所有日志都追加到同一个文件;二是配置了轮转但保留数量过多,几十个历史文件堆在一起;三是日志级别开得太细,调试信息把正常记录淹没;四是某些程序出错后疯狂重试,短时间内产生大量重复日志。另外,蜘蛛和爬虫的访问记录也会让访问日志明显膨胀,尤其是站点被大量扫描或抓取时。
日志轮转的基本检查
确认轮转是否生效
在 Linux 上,多数发行版用 logrotate 管理日志轮转。不要只看配置文件是否存在,要实际确认日志目录里有没有按日期切分出来的文件,比如 access.log、access.log.1、access.log.2.gz 这类命名。如果只有 access.log 一直不变大,说明轮转可能没有匹配到路径,或者程序自己接管了日志写入。
轮转周期与保留数量
- 轮转周期:访问量大的站点按天切分比较合适,量小的可以按周。
- 保留数量:一般保留 7 到 30 份,能覆盖最近一次故障排查即可。
- 压缩归档:历史日志建议启用 gzip 压缩,能省下不少空间。
- 轮转后动作:确认程序在日志被切走后能重新打开文件句柄,否则新日志可能继续写到旧文件。
磁盘空间自查清单
不要等告警响了才去看磁盘。可以定期执行下面几项检查:
- 查看根分区和各挂载点的使用率,重点关注 /var、/home、/tmp 和数据库数据目录。
- 找出占用最大的目录,逐层定位是日志、备份还是缓存。
- 检查是否有被删除但进程仍占用的文件,这类文件不会出现在目录大小里,但会一直占着磁盘。
- 确认日志目录是否和数据目录在同一分区,避免日志把数据库的可用空间挤掉。
- 检查临时目录和上传目录,异常请求可能在那里留下大量碎片文件。
- 给磁盘使用率设置阈值告警,比如 80% 提醒、90% 严重,留出处理时间。
日志保留与清理策略
日志不是留得越久越好。保留时间要结合排查需要和合规要求来定。常见的做法是:热日志保留 7 天,压缩归档保留 30 到 90 天,更早的按需备份到其他存储后删除。清理时不要直接用通配符删除正在写入的文件,先确认轮转配置已经把它切分出去。对于蜘蛛访问日志,如果想分析抓取频次,可以单独保留一份精简记录,而不是把完整访问日志无限期堆在服务器上。
日志级别与噪音控制
应用日志的级别设置同样重要。生产环境通常用 info 或 warn,不建议长期开着 debug。框架的 SQL 日志、缓存命中日志、健康检查日志,如果每次都记,量会非常大。可以按模块调整级别,把真正需要关注的部分留下来。错误日志里如果出现大量重复堆栈,说明某个问题在持续发生,应该尽快修复,而不是让它继续刷盘。
日志的价值在于能帮你还原问题现场,而不是把磁盘塞满。保留够用的时间,压缩不需要频繁查看的部分,给关键日志留出空间,就已经达到了大部分站点的需求。
把检查变成习惯
可以把磁盘水位和日志轮转检查放进日常巡检,或者用监控工具自动采集。每周看一眼使用率趋势,比等到服务不可用再登服务器要轻松得多。对于有蜘蛛池或抓取分析需求的站点,日志确实是重要数据来源,但前提是服务器本身稳定运行,否则日志还没分析,站点先打不开了。