apache日志切割核心是使用piped logger机制,通过rotatelogs(官方自带)或cronolog(第三方)将日志实时交由外部工具按时间(如86400秒)或大小(如100m)自动切分,避免单文件膨胀、阻塞请求及磁盘耗尽,无需logrotate被动轮转或服务重启。
apache 主配置文件中配置日志切割,核心是用 piped logger(管道日志)方式把日志实时交给外部工具处理,而不是让 apache 直接写入单个大文件。这种方式能按时间或大小自动切分、避免阻塞请求、防止磁盘撑爆——不依赖 logrotate 被动轮转,也不需要重启服务。
用 rotatelogs 实现原生管道切割
rotatelogs 是 Apache 官方自带的管道日志工具,轻量、稳定、无需额外安装(Linux 通常随 httpd 包附带,Windows 下为 rotatelogs.exe)。直接在 httpd.conf 或虚拟主机配置中修改 CustomLog 和 ErrorLog 行:
- 按天切割访问日志:CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_%Y%m%d.log 86400" combined
- 按大小切割错误日志(100MB 后新建):ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_%Y%m%d_%H%M.log 100M"
- 注意路径权限:确保 Apache 进程用户(如 www-data 或 apache)对
/var/log/httpd/有写权限 - Windows 用户路径用正斜杠即可:
CustomLog "|bin/rotatelogs.exe logs/access_%Y%m%d.log 86400"
用 cronolog 替代 rotatelogs(更灵活的命名与路径)
cronolog 支持更自由的路径模板(比如按小时建子目录),适合需分级归档的场景:
- 示例:CustomLog "|/usr/bin/cronolog /var/log/httpd/%Y/%m/%d/access.log" combined
- 会自动创建
/var/log/httpd/2026/09/16/access.log并写入,当天结束后自动切换 - 需确认系统已安装 cronolog(CentOS/RHEL:yum install cronolog;Ubuntu:apt install cronolog)
- 不建议和 rotatelogs 混用,二者逻辑冲突
关键避坑点:防止丢日志、卡进程、权限失败
管道日志看似简单,但配置不当极易导致日志丢失或 Apache 响应变慢:
- 不要用
rotate 0或copytruncate配合管道日志——logrotate 和 piped logger 是两套互斥机制,混用会导致重复写或句柄错乱 - 确保 rotatelogs 进程持续运行:
ps aux | grep rotatelogs,若频繁退出,检查磁盘空间、inode 数量及 ulimit -n 限制 - 避免将日志写入 NFS 或低性能挂载点,rotatelogs 对 I/O 延迟敏感,可能拖慢整个请求链路
- 修改配置后必须执行
apachectl configtest && apachectl graceful,用 graceful 而非 restart,确保旧日志进程自然退出、新管道平滑接管
补充:Lumberjack 不是 Apache 原生方案
需要说明的是,Lumberjack 是 Logstash 旧版日志采集协议,不是 Apache 日志切割工具。它不参与日志生成或轮转,只负责传输。如果你看到“Apache + Lumberjack”,实际是 Filebeat 或 Logstash 作为客户端采集已切割好的日志文件,属于日志收集层,不在主配置中设置。真正做切割的,还是 rotatelogs、cronolog 或 logrotate。











