通过 logrotate 配置日志轮滚

logrotate 是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志文件,这个过程称为转储。这个程序目前是 CentOS 自带的。

logrotate 的执行由系统的 crond 服务实现,通过 crond 的日执行脚本 /etc/cron.daily/logrotate 来触发。

logrotata 使用起来非常舒服,能满足大多数情况的需求,我忽然想起 Nginx 竟然有一个网上流传很久的日志切割脚本,这真是多此一举。

现在我们看下如何配置常规的 Nginx 访问日志轮滚策略:

如果你使用 yum 或 rpm 安装的话,可以检查下 /etc/logrotate.d/ 是否有对应 Nginx 的配置,否则就需要新建一个。

vi /etc/logrotate.d/nginxlog
/var/log/server/nginx/*log { 
    daily 
    dateext 
    rotate 15 
    missingok 
    ifempty 
    compress 
    delaycompress 
    sharedscripts 
    postrotate 
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` 
    endscript 
} 

主要说明:

  • 轮滚 /var/log/server/nginx/ 目录下所有的 log 结尾的日志文件
  • daily 每日运行
  • dateext 自动生成日期后缀
  • rotate 15 保存副本天数
  • compress 启用压缩
  • delaycompress 启用延迟压缩,今天会压缩前天的,在做日统计的时候非常有用
  • postrotete 触发 Nginx 生成新的日志文件

搞完后,可以手动执行命令触发一下:

logrotate -f /etc/logrotate.conf    # –强制轮转 
logrotate -vf /etc/logrotate.conf  # –再加一个-v参数查看轮转的过程 

然而,你会发现你的日志轮滚总是在凌晨 3 点运行! 这未免有点尴尬,修改 START_HOURS_RANGE:

vi /etc/anacrontab 

# START_HOURS_RANGE=0-8  表示什么时候运行 CROND 日常任务
# RANDOM_DELAY=45 随机延迟时间

好了,可以了。