nginx 中可用 cronolog 实现按小时精确切分 access_log,通过管道将日志输出至 cronolog 并用 %y%m%d%h 命名文件,error_log 不支持该方式,需确保权限并配合清理脚本管理旧日志。

在 Nginx 中实现按小时精确切分日志,cronolog 是一个轻量、稳定且被广泛验证的方案。它本身不直接读取 Nginx 日志,而是作为管道接收器,将标准输入按时间模板动态路由到对应命名的日志文件中。关键在于让 Nginx 的 access_log 或 error_log 指令输出到 cronolog 进程的标准输入。
安装与确认 cronolog 可用
大多数 Linux 发行版可通过包管理器安装:
- CentOS/RHEL:
yum install cronolog或dnf install cronolog - Ubuntu/Debian:
apt install cronolog
安装后运行 cronolog --version 确认版本(建议使用 1.7+),并检查是否在 /usr/bin/cronolog 或 /usr/local/bin/cronolog 路径下。
配置 Nginx 使用 cronolog 按小时切分 access_log
修改 Nginx 配置(如 /etc/nginx/nginx.conf 或站点 conf 文件),将原本的静态日志路径替换为带时间格式的 cronolog 命令:
access_log "|/usr/bin/cronolog /var/log/nginx/access_%Y%m%d%H.log" main;
说明:
-
|表示管道方式启动外部程序,Nginx 将日志行实时写入 cronolog 的 stdin -
%Y%m%d%H对应年月日小时(如2024052014表示 2024 年 5 月 20 日 14 点),cronolog 每小时自动切换输出文件 - 生成的文件名为
/var/log/nginx/access_2024052014.log,无需手动创建目录,cronolog 会自动创建
⚠️ 注意:不能使用 error_log 的管道方式(Nginx 官方不支持 error_log 接管道),仅 access_log 可用此法。
确保权限与重启生效
cronolog 进程以 Nginx worker 用户(通常是 nginx 或 www-data)身份运行,需保证该用户对日志目录有写权限:
- 执行
chown -R nginx:nginx /var/log/nginx(根据实际用户调整) - 确认 SELinux 或 AppArmor 未拦截(如启用,可临时设为 permissive 模式测试)
- 重载 Nginx:
nginx -t && nginx -s reload
几分钟后检查 /var/log/nginx/ 目录,应能看到类似 access_2024052014.log 的文件,并随小时递增更新。
补充建议:日志轮转与清理
cronolog 只负责切分,不自动清理旧日志。推荐搭配 logrotate 或简单 shell 脚本定期清理:
- 例如保留最近 7 天(168 小时)日志:
find /var/log/nginx -name "access_*.log" -mmin +10080 -delete - 也可用 logrotate 配合
daily+dateformat %Y%m%d%H,但需注意其默认不支持小时级精度,更推荐 cronolog 自带切分 + 独立清理脚本
不复杂但容易忽略。











