cronolog一个经典的日志切割工具

cronolog 是一个用 C 写的小工具,用于按时间自动切割日志文件。它主要用于 Web 服务器(如 Apache、Nginx)或其他进程,将日志按时间组织成多个文件,方便管理和归档。

  • 版本:1.6.2(你提供的版本)

  • 用途

    • 按天、小时或自定义时间切割日志
    • 文件名中包含时间戳
    • 适用于需要精细化日志管理的系统
  • 优势

    • 灵活的时间格式(%Y-%m-%d、%H 等)
    • 无需定时任务即可自动切割
    • 可输出到管道,结合 Web 服务器使用

使用场景

  • Apache、Nginx、Squid 这类服务端进程默认只能把日志写到一个文件,不会自动分割。

  • 借助 cronolog,可以实现类似:

    • 每天生成一个新的访问日志
    • 每小时切割一个错误日志
    • 文件名中自动包含时间戳

安装方法

1
2
3
4
5
6
7
8
# 解压
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2

# 配置编译
./configure
make
sudo make install

典型用法

1. 命令行测试

1
echo "Hello cronolog" | /usr/local/sbin/cronolog /var/log/test_%Y-%m-%d.log

执行后,会生成:

/var/log/test_2025-09-29.log

2.Apache

httpd.conf 中:

1
CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/access_%Y-%m-%d.log" combined

这会让 access.log 每天生成一个:

access_2025-09-29.log
access_2025-09-30.log
...

3. Nginx

nginx.conf 中:

1
2
3
4
5
6
7
8
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log "|/usr/local/sbin/cronolog /var/log/nginx/access_%Y-%m-%d.log" main;
error_log "|/usr/local/sbin/cronolog /var/log/nginx/error_%Y-%m-%d.log";
}
  • %Y-%m-%d → 按天切割
  • 可以使用 %H 按小时切割
  • 可以使用 %Y/%m/%d/%H/ 创建多级目录存放日志

4. 高级示例(按小时切割,生成目录)

1
access_log "|/usr/local/sbin/cronolog /var/log/nginx/%Y/%m/%d/access_%H.log" main;

效果:

/var/log/nginx/2025/09/29/access_13.log
/var/log/nginx/2025/09/29/access_14.log
...

注意事项

  1. 高并发环境下可能成为性能瓶颈 → 日志量大时建议用 logrotate 或 Nginx 内置日志切割方案
  2. cronolog 进程挂掉会导致日志丢失
  3. 管道方式可以让日志按时间格式自动管理,但无法自动压缩,需要额外脚本