1. logrotate简介
logrotate是一个日志文件管理工具。用来把旧文件轮转、压缩、删除,并且创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小、天数等来转储,便于对日志文件管理,一般都是通过cron计划任务来完成的,并且可以发送日志到指定的E-mail。
The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files. Logrotate allows for the automatic rotation compression, removal and mailing of log files. Logrotate can be set to handle a log file daily, weekly, monthly or when the log file gets to a certain size.
2. logrotate安装及配置详解
2.1 logrotate安装
在Debian或Ubuntu上:
# apt-get install logrotate cron
在Fedora,CentOS或RHEL上:
# yum install logrotate crontabs
2.2 logrotate配置
logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。
logrotate 的配置文件是 /etc/logrotate.conf。主要参数如下表:
参数 | 说明 |
---|---|
compress | 启用压缩,指的是轮替后的旧日志,这里默认用的是gzip压缩的 |
compressoptions | 以gzip -9的模式压缩 |
uncompresscmd | 解压日志,默认是gunzip |
daily | 每天轮替选项 |
dateext | 轮替的日志文件会附加上一个短横线和YYYYMMDD格式的时间戳 |
delaycompress | 将以前的日志文件压缩推迟到下一次轮替 |
ifempty | 即使日志文件是空的也轮替 |
将轮替后的文件发送到指定E-mail地址 | |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断,开始轮替 |
mailfirst/maillast | 向邮件发送轮替文件/轮替后历史文件(默认) |
monthly | 一个月轮替一次 |
nocompress | 如果在logrotate.conf中启用了压缩,这里是做不用压缩的参数 |
nomail | 不发送邮件到任何地址 |
ifempty | 如果日志时空的就不轮替 |
olddir directory | 轮替后日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
postrotate/endscript | 在做完轮替后的命令,两个关键字必须单独成行,使用的操作在2者之间相当于分组“{}”,注意的使用外部指令时要用绝对路径 |
prerotate/endscript | 在做轮替前的命令,同上 |
rotate count | 轮替最多保留之前的数据几次,超出的将被删除或邮件接收,设为0则不保存 |
size size | 当日志增长到指定大小的时候开始轮替,它不会考虑 |
start count | 轮替文件名基于这个数字。 例如,指定0时,原日志文件轮替的备份文件以.0为扩展名,如果指定9,就直接从.9开始跳过0-8 然后再继续向后轮替rotate指定的次数。 |
weekly | 如果当前的星期几比上次轮替的星期几少,或者过了一个多星期,就会发生轮替通常是在每周的第一天轮替,如果logrotate不是每天运行的,会在第一次有机会时进行轮替。 |
yearly | 如果当前年份不同于上次轮替的年份,则进行日志轮替 |
create mode owner group | 在轮替动作之后,postrotate脚本执行之前,立即使用刚轮替的日志文件名创建日志文件。 MODE 指定日志文件的权限(0660之类) OWNER 指定日志文件的属主 GROUP 指定日志文件的属组 |
extension ext | 日志文件可在轮替后使用指定的EXT扩展名。如果使用压缩,通常EXT后还会加上压缩文件的扩展名,通常是.gz。例如想把mylog.foo轮转为mylog.1.foo.gz而不是mylog.foo.1.gz |
3. logrotate示例
3.1 logrotate配置语法
logrotate.conf中的配置语法很简单: 日志文件名的绝对路径(如果有多个用空格隔开) { 需要配置的参数 } 命令参数说明 # logrotate --help Usage: logrotate [OPTION...] <configfile> -d, --debug 调试模式,输出调试结果,并不执行。隐式-v参数 -f, --force 强制模式,对所有相关文件进行rotate -m, --mail=command 发送邮件 (instead of `/bin/mail') -s, --state=statefile 状态文件,对于运行在不同用户情况下有用 -v, --verbose 显示debug信息
3.2 logrotate应用示例
/var/log/nginx/*.log /var/log/tomcat/*log { # 可以指定多个路径 daily # 日志轮询周期,weekly,monthly,yearly rotate 30 # 保存30天数据,超过的则删除 size +100M # 超过100M时分割,单位K,M,G,优先级高于daily compress # 切割后压缩,也可以为nocompress delaycompress # 切割时对上次的日志文件进行压缩 dateext # 日志文件切割时添加日期后缀 missingok # 如果没有日志文件也不报错 notifempty # 日志为空时不进行切换,默认为ifempty create 640 nginx nginx # 使用该模式创建日志文件 sharedscripts # 所有的文件切割之后只执行一次下面脚本 postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript } 当配置完成后,可以通过如下方式进行测试。 ----- 可直接手动执行 $ logrotate --force /etc/logrotate.d/nginx ----- 显示详细的信息;而且--debug/-d实际上不会操作具体文件(Dry Run) $ logrotate --debug --verbose --force /etc/logrotate.d/nginx 在 CentOS 中,默认会将日志保存 /var/lib/logrotate.status 文件中,如果需要指定到其它文件,可以通过 -s/--state 参数指定。 /var/log/messages { rotate 5 weekly postrotate /sbin/killall -HUP syslogd endscript } "/var/log/httpd/access.log" /var/log/httpd/error.log { rotate 5 mail www@my.org size 100k sharedscripts postrotate /sbin/killall -HUP httpd endscript } /var/log/news/* { monthly rotate 2 olddir /var/log/news/old missingok postrotate kill -HUP ‘cat /var/run/inn.pid‘ endscript nocompress }
参考: