apache 默认日志不切割,使用 cronolog 配合管道日志可按天自动切分,无需重启服务;需安装 cronolog、修改 customlog 为管道命令并验证权限与路径。

Apache 默认将所有访问日志写入同一个文件,长期运行会导致单个日志文件巨大、难以分析、备份困难。使用 Cronolog 配合 Apache 的管道日志(Piped Logs)功能,可实现按天(或按小时、月)自动切分日志,无需重启服务,也无需依赖 logrotate 的轮转延迟。
确认 Cronolog 已安装并可用
Cronolog 是一个轻量级日志切割工具,多数 Linux 发行版源中都提供:
- CentOS/RHEL:
yum install cronolog或dnf install cronolog - Ubuntu/Debian:
apt install cronolog - 如需源码编译,可从 GitHub 仓库 获取最新版
- 安装后执行
cronolog --version验证是否可用
配置 Apache 使用管道日志调用 Cronolog
修改 Apache 的虚拟主机或主配置(如 /etc/httpd/conf/httpd.conf 或站点配置文件),将 CustomLog 指令由普通文件路径改为管道命令:
原写法(不切割):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
CustomLog "/var/log/httpd/access_log" combined
改为管道方式(按天切分):
CustomLog "|/usr/bin/cronolog /var/log/httpd/access_%Y%m%d.log" combined
-
|表示启用管道日志,Apache 将日志输出通过 stdin 交给 cronolog 处理 -
/usr/bin/cronolog路径需根据实际安装位置调整(可用which cronolog查看) -
%Y%m%d是时间格式符,生成类似access_20240520.log的文件名;支持%H(小时)、%m(月)、%W(周)等 - 确保
/var/log/httpd/目录存在且 Apache 进程(如 www-data 或 apache)有写入权限
验证与排错要点
配置完成后,重载 Apache(systemctl reload httpd 或 apachectl graceful),观察行为:
- 当日志首次写入时,cronolog 会自动创建带日期的文件(如
access_20240520.log),不会覆盖旧文件 - 每天 00:00:00 后,新日志自动写入下一个日期文件,无需人工干预
- 若日志未生成,检查 Apache 错误日志(
ErrorLog)是否有pipe failed或Permission denied提示 - 常见错误:cronolog 路径错误、目录无写权限、SELinux 限制(RHEL/CentOS 可临时用
setenforce 0测试) - 可手动测试管道是否通畅:
echo 'test' | /usr/bin/cronolog /tmp/test_%Y%m%d.log,查看是否生成对应文件
进阶建议:结合日志清理与压缩
Cronolog 只负责切分,不清理历史日志。建议配合简单脚本定期归档:
- 用
find /var/log/httpd -name "access_*.log" -mtime +30 -delete删除 30 天前的日志 - 或用
gzip压缩旧日志:find /var/log/httpd -name "access_??????.log" -mtime +7 -exec gzip {} \; - 将上述命令加入 crontab(如每天凌晨 2 点执行):
0 2 * * * /path/to/cleanup-logs.sh - 注意避免在 cronolog 正在写入的当天文件上执行操作(
mtime +0不会匹配当天文件,安全)










