logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件,logrotate的运作完全自动化,不必进行任何进一步的人为干预。
之前有写过一篇 nginx日志切割及7天前的历史日志删除的脚本 ,也可以用logrotate来实现
0x01 配置文件
主流Linux发行版上都默认安装有logrotate包。
默认的配置文件路径:
/etc/logrotate.d:不同的程序日志可以单独写个配置文件放着这里面,没有设定的细节自动以conf中设定的来作默认值;
/etc/logrotate.conf:主配置文件。
运行命令:
logrotate [-vf] /etc/logrotate.conf
-v:启动显示模式,会显示 logrotate 执行的过程
-f:不论是否符合配置文件地规则,强制每个日志都进行 rotate 的动作
0x02 配置说明
# vim /etc/logrotate.conf weekly #一周执行一次,其它可用值为'daily','monthly'或'yearly' rotate 4 #保留多少个日志文件 create #创建新的日志文件 dateext #文件后缀是日期格式,如:secure-20161030,如果注释掉则格式为:secure-1 #compress #是否压缩日志 include /etc/logrotate.d #加载logrotate.d目录中的所有文件 /var/log/wtmp { #针对/var/log/wtmp所设定的参数 monthly #每月执行一次 create 0664 root utmp #指定新建日志文件的权限和所属用户、组 minsize 1M #文件大小超过1M才会切割 rotate 1 #只保留一个日志 } /var/log/btmp { #针对/var/log/btmp所设定的参数 missingok #如果指定的目录不存在,logrotate会报错,此项用来关闭报错 monthly #每月执行一次 create 0600 root utmp #指定新建日志文件的权限和所属用户、组 rotate 1 #只保留一个日志 }
PS:wtmp可记录用户登录系统和重启的时间;另外因为有minsize的参数,所以不一定是每月执行一次,得先满足minsize设置的大小。
0x03 实例
1、切割syslog服务日志
# vim /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler #上面几个为被处理的日志绝对路径,每行一个或者用空格分隔 { sharedscripts # 表示postrotate脚本在压缩了日志之后只执行一次 postrotate #在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务 /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true #相当于reload endscript }
执行脚本:
可调用外部指令来进行额外的命令,这个设定需与 sharedscripts .... endscript 设定合用才行。
prerotate:在启动 logrotate 之前进行的指令,例如修改文件的属性等动作;
postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务。
可以看出syslog配置文件没有写执行周期,日志后缀这些,就会自动使用logrotate.conf配置参数。
假设messages日志文件有增加chattr +a属性时,根据上面配置messages会被更改成messages-20161030。但由于我们加上了+a参数,更名是失败的。这时就可以用下面的配置来操作
# vim /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts prerotate /usr/bin/chattr -a /var/log/messages #先把+a属性移除 endscript sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true /usr/bin/chattr +a /var/log/messages #更名之后再加上+a属性 endscript }
2、切割Nginx
在/etc/logrotate.d下新建nginx文件;
编辑nginx文件,添加下面配置文件
/usr/local/nginx/logs/*.log { daily rotate 30 sharedscripts postrotate if [ -f /usr/local/nginx/logs/nginx.pid ]; then kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` fi endscript }
按天切割nginx日志文件,保留30个日志文件,最后重启nginx。

您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏