apache日志切割本身不直接归档,仅按天生成新文件;归档(压缩、重命名、清理)由logrotate在每天凌晨通过/etc/cron.daily/logrotate统一执行,配合daily、rotate、compress等配置实现安全可控的自动化管理。

Apache 日志切割本身不直接归档(压缩+重命名),它只负责生成按天命名的新文件;归档动作需靠系统级工具完成,最常用、最稳妥的方式是用 logrotate 配合系统定时任务(/etc/cron.daily/logrotate)自动处理前一天的日志。
logrotate 是归档的主力,不是 Apache 自己干的
Apache 的 rotatelogs 或 cronolog 只做“写入分流”:让当天日志进 access_20260820.log,次日零点起自动切到 access_20260821.log。它们不压缩、不改名、不删旧文件——这些归档操作由 logrotate 在每天固定时间统一执行。
- logrotate 默认每天凌晨运行一次(通过
/etc/cron.daily/logrotate触发) - 它扫描你配置中指定的日志路径(如
/var/log/httpd/*.log),识别出“已结束”的前一天日志(比如昨天的access_20260819.log) - 然后按规则重命名(加 .1 后缀)、压缩(.gz)、保留份数、清理过期文件
关键配置:让 logrotate 知道哪些日志要归档
在 /etc/logrotate.d/httpd 中写明规则,例如:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
/var/log/httpd/access_*.log /var/log/httpd/error_*.log {
daily
rotate 30
compress
delaycompress
missingok
create 0644 apache apache
sharedscripts
postrotate
systemctl reload httpd > /dev/null 2>&1
endscript
}
-
daily:每天检查一次,匹配“已满一天”的日志文件(即前一天生成的) -
rotate 30:最多保留 30 份归档,超出的自动删除 -
compress+delaycompress:本次轮转不压缩,下一轮才压,避免正在写的日志被误压 -
postrotate:归档完立刻重载 Apache,确保新日志写入当前日期文件
验证和调试不能跳过
上线前务必手动测试,避免配置错误导致日志丢失:
- 模拟执行(不实际改文件):
logrotate -d /etc/logrotate.d/httpd查看是否报错 - 强制立即轮转(用于验证归档效果):
logrotate -vf /etc/logrotate.d/httpd - 检查结果:
ls -lt /var/log/httpd/应看到类似access_20260819.log.1.gz的归档文件
为什么不用自己写 crontab 脚本删日志?
有人会写脚本用 find /var/log/httpd -name "access_*.log" -mtime +7 -delete,但这有风险:
- 可能误删当天正在写的日志(如果命名没严格隔离)
- 不压缩,磁盘空间浪费大
- 没 postrotate 机制,Apache 不会自动创建新文件,容易中断写入
- logrotate 是经过长期验证的工业级方案,安全、可控、可审计










