随着时间的推移,Application的日志内容越来越多(对我而言,主要是nginx 和 unicorn),而日志分析第一步往往是日志分片, 因为你不可能一次去处理几十天的日志,内容太多。

有些人可能会自己写一些定时任务来处理日志分片,其实这样做既费事,又不能保证与其他任务进程完美结合,而Linux 上自带的 logrotate 却是一个比较好解决方案, 而且 logrotate 底层是依赖了 crontab, 很容易自定义任务周期。

logrotate 的配置文件默认都放在了 /etc/logrotate.d 里面。

其实 nginx 本身就做好了分片,下面是一段nginx 默认的 logrotate 配置。

# 文件位置是 /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
          run-parts /etc/logrotate.d/httpd-prerotate; \
        fi \
    endscript
    postrotate
        [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
    endscript
}

我使用的 unicorn 的配置:

# 文件位置是 /etc/logrotate.d/unicorn_procution

# Modify the following glob to match the logfiles your app writes to:
/var/www/rails_app/shared/log/app_production.log {
    weekly
    missingok
        # keep 12 rotates
    rotate 12
    compress # must use with delaycompress below
        # add timestamp to log file
    dateext

    # this is important if using "compress" since we need to call
    # the "lastaction" script below before compressing:
    delaycompress

    # note the lack of the evil "copytruncate" option in this
    # config.  Unicorn supports the USR1 signal and we send it
    # as our "lastaction" action:
    lastaction
        pid=/var/www/rails_app/current/tmp/pids/unicorn.pid
        sudo test -s $pid && sudo kill -USR1 "$(cat $pid)"
    endscript
}

OK,按照上面的配置,已经实现了 nginx 和unicorn 日志分片了。

更多 logrotate 参数 的意义可以参考 http://linux.die.net/man/8/logrotate