nginx-logrotation-日志切割

nginx日志处理

在 nginx 中,主要有 access 日志、error 日志 、 rewrite 日志。前两种由 ngx_http_log_module 模块予以支持,rewrite 日志则由 ngx_http_rewrite_module 模块提供,这两个模块默认都已包含且启用。

日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到。

我们不管在生产环境还是开发环境,看日志是必不可少的,日志中往往包含很多有用的信息,有时候被DDOS、上传非法文件等等,我们都需要通过日志分析。

但是日志是跟访问量成正比的,你的访问量越大,你的各种级别日志就越多,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成个很严重的问题。

对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题。

除此之外,处理查看一个单个的庞大日志文件也常常是件十分棘手的事。你阅读、打开都要花费很大力气,那么怎么才能处理好这种情况?

logrotate 在很多 Linux 发行版上都是默认安装的。系统会定时运行 logrotate,一般是每天一次。系统是这么实现按天执行的。

crontab 会每天定时执行 /etc/cron.daily 目录下的脚本,而这个目录下有个文件叫 logrotate。

logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。

例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除超过6个月的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。

系统会利用定时任务定时运行logrotate,一般是每天一次。crontab会每天定时执行/etc/cron.daily目录下的脚本,而这个目录下有个文件叫logrotate。我们只需要配置你所需要切割的参数就可以。

很多程序的会用到logrotate滚动日志,比如nginx。它们安装后,会在/etc/logrotate.d这个目录下增加自己的logrotate的配置文件。logrotate什么时候执行 /etc/logrotate.d下的配置呢?看到/etc/logrotate.conf里这行,一切就不言而喻了。

在 centos 上脚本内容是这样的:系统自带 crontab task:/etc/cron.daily/logrotate,每天运行一次。

[root@gop-sg-192-168-56-103 logrotate.d]# cat /etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

可以看到这个脚本主要做的事就是以/etc/logrotate.conf为配置文件执行了 logrotate。就是这样实现了每天执行一次 logrotate。

因为我的系统执行 /etc/cron.daily 目录下的脚本不是我想滚动日志的时间,所以我把 /etc/cron.daily/logrotate 拷了出来,改了一下 logrotate 配置文件的路径,然后在 crontab 里加上一条指定时间执行这个脚本的记录,自定义周期滚动日志就大功告成了。这种自定义的方式有两点要注意:

  • 配置文件里一定要配置 rotate 文件数目 这个参数。如果不配置默认是 0 个,也就是只允许存在一份日志,刚切分出来的日志会马上被删除。多么痛的领悟,说多了都是泪。

  • 执行 logrotate 命令最好加 -f 参数,不然有时候配置文件修改的内容不生效。