Logrotate配合LNMP定时自动智能清扫日志文件

在这台新Centos 6.7服务器上,我们经过之前的MySQL 5.7二进制安装优化PHP 5.6编译安装配置Nginx 1.3(tengine-2.1.2)编译安装,以及各自的配置,LNMP手动搭建可算大功告成。现在,我们要考虑的是日志文件,特别是web请求的日志,随着网站访客日日夜夜的访问,必然会引起日志日趋庞大的问题。那么,我们如何轻松的完成智能整理呢? 那就要看一款叫做logrotate的进程啦。

现在,我们先看一看NMP中分别有哪些日志文件需要整理。

  • Nginx:通过查看配置得知有进程级别的/usr/local/nginx/logs/nginx_error.log和web应用级的/data/www/log/*.log
  • MySQL:检查/etc/my.cnf发现有/data/mysql/log/mysql-error.log和/data/mysql/log/mysql-slow.log
  • PHP:查看php.ini发现有个/usr/local/php/var/log/php_error.log
  • PHP-FPM:查看php-fpm.conf发现有log/php-fpm_error.log,以及slowlog=var/log/*_slow.log

好了,目标已经锁定完毕。我们来写logrotate的配置文件,以便让日志得到妥善处理。

sudo vim /etc/logrotate.d/nmp
#######
/usr/local/nginx/logs/*.log /data/mysql/*.log /usr/local/php/var/log/*.log {
size 36M
rotate 6
monthly
missingok
notifempty
create 644 root root
compress
delaycompress
sharedscripts
}
#############
sudo vim /etc/logrotate.d/vhosts
################
/data/www/log/*.log {
rotate 9
daily
missingok
notifempty
create 644 root root
compress
delaycompress
sharedscripts
postrotate
#/usr/sbin/apachectl graceful > /dev/null
[ ! -f /usr/local/nginx/logs/nginx.pid ] || kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` > /dev/null
endscript
}
################

测试一下:

logrotate -d /etc/logrotate.d/nmp #-d参数表示测试模拟运行 不加d就是直接运行
logrotate -d /etc/logrotate.d/vhosts
logrotate -vf /etc/logrotate.d/nmp #-f表示强制轮回,-v则是显示详细输出
logrotate -vf -s /var/log/logrotate-status /etc/logrotate.d/nmp #将自身日志保存到/var/log/logrotate-status

上面的参数字面意思都大致可以理解,下面是详细说明:

  • monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
  • size:表示大于那个值才会去轮回
  • rotate 6: 一次将存储6个归档日志。对于第七个归档,时间最久的归档将被删除。
  • compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
  • delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
  • missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
  • notifempty: 如果日志文件为空,轮循不会进行。
  • create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
  • sharedscripts:表示之前的几个日志共用一个脚本的。即所有的日志文件都轮转完毕后统一执行一次脚本。
  • postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。