linux_logrotate
logrotate命令
logrotate命令用于系统日志进行轮转、压缩和删除,也可以将日志发送到指定邮箱。使用logrotate指令,可让你轻松管理系统所产生的记录文件。每个记录文件都可以被设置成每日,每周或每月处理,也能在文件太大时立即处理。你必须自行编辑,指定配置文件,预设的配置文件存放在/etc/logrotate.conf文件中。
语法
logrotate (选项)(参数)
选项
- -? 或 --help: 在线帮助
- -d 或 --debug: 详细指令执行过程,便于拍错或了解程序执行的情况
- -f 或 --force: 强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然
- -s<状态文件> 或 --state=<状态文件>: 使用指定的状态文件
- -v 或 --version: 显示指令执行过程
- -usage: 显示指令基本用法
配置选项
- compress: 通过gzip压缩转存储旧的文件
- nocompress: 不需要压缩,用这个参数
- copytruncate: 用于还在打开中的日志文件,把当前日志备份并截断
- nocopytruncate: 备份日志文件但是不截断
- create mode owner group: 使用指定的文件模式创建新的日志文件
- nocreate: 不建立新的日志文件
- deplaycompress: 和compress一起使用时,转储的日志文件到下一次转储时才压缩
- errors address: 专储时的错误信息发送到指定的Email地址
- ifempty: 即使是空文件也转储,这个是logrotate的缺省选项
- notifempty: 如果是空文件的话,不转储
- mail address: 把转储的日志文件发送到指定的E-mail地址
- nomail: 转储时不发送日志文件
- olddir directory: 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
- noolddir: 转储后的日志文件和当前日志文件放在同一个目录下
- prerotate/endscript: 在转储之前把需要执行的命令放在它们之间,这两个关键字必须单独成行
- postrotate/endscript: 在转储以后把需要执行的命令放在它们之间,这个两个关键字必须单独成行
- sharedscripts: 所有的日志文件都轮转完毕后统一执行一次脚本
- missingok: 如果日志不存在,不会发出抱怨
- daily: 指定转储周期为每天
- weekly: 指定转储周期为每周
- monthly: 指定转储周期为每月
- rotate count: 指定日志文件删除之前转储的次数。例如: 0指没有备份,5只保留5个备份
- size size: 当日志文件到达指定的大小时才转储,Size可以指定bytes(缺省)以及KB(sizek)或者MB
运行机制
logrotate在很多linux发行版上都是默认安装的。系统会定时运行logrotate,一般是每天一次。crontab会每天定时执行/etc/cron.daily目录下的脚本,而这个目录下有个文件叫logrotate。在centos上脚本内容是:
/etc/cron.daily/logrotate /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1 EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0
配置实例
/usr/local/nginx/logs/*.log { daily dateext compress rotate 7 sharedscripts postrotate kill -USR1 `cat /var/run/nginx.pid` endscript }
logrotate常见问题
- compress、copytruncate、delaycopress、dateext
- 这几个选项的执行顺序,首先程序先判断是否有昨天的文件(access.log-2017-07-08)未压缩,有则压缩,没有则跳过这一步。然后,程序判断是否要对log进行rotate,需要则进行复制截断。命令(access.log-2017-07-09)最后,程序判断现有压缩包的个数是否超过最大(rotate n的值),如果超过则把最老的删除。
- 一些log文件莫名的被rotate
- 这可能是相关软件时通过rpm安装的,安装后自动将自定义的conf文件放到/etc/logrotate.d/下,并通过cron.daily自动运行。
- 解决: 删除/etc/logrotate.d/下相关的文件。
- log does not need rotating
- logrotate最容易遇到的问题就是,创建完一个新的configgure以后想用命令/usr/sbin/logrotate -v /etc/rotate.conf 进行执行查看运行情况时,logrotate会提示不需要rotate。出现的原因是,logrotate在对status未记录的文件第一次rotate时,会自动在status添加一条这份文件的记录,并将操作的时间设置为当天。因此,接下来程序判断是否有必要对此文件进行logrotate时会发现这个文件今天已经操作过,就不进行相关操作了。
- 解决:第一次执行后,运行命令3,把对应文件的日期改为昨天,再次运行。或者在运行时用-s来指定status文件,然后进行修改。
logrotate疑问
- sharedscripts的作用是什么?
- 在前面Nginx的例子里声明日志文件的时候用了星号通配符,也就是说这里可能涉及多个日志文件,比如: access.log和error.log。sharedscripts的作用是在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令,那么每个日志文件轮转完毕后都会执行一次脚本。
- rotate和maxage的区别是什么?
- 他们都是用来控制保存多少日志文件,区别在于rotate是以个数为单位的,而maxage是以天数为单位的。如果我们是以按天来轮转日志,那么二者的差别就不大了。
- 切割日志的时间,怎么设定?
- logrotate是基于CRON运行的,所以这个时间是由CRON控制的,具体可以查询CRON的配置文件(ubuntu: /etc/crontab | centos: /etc/anacrontab)。可以手动改成如: 23:59等时间执行
-
配置文件为: /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 59 23 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly 配置文件为: /etc/anacrontab # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=9 (这里是个最大随机延时时间) # the jobs will be started during the following hours only START_HOURS_RANGE=23-24(这是日志切割时间点,即只在23点到24点开始切割,不出意外就是23点啦) #period in days delay in minutes job-identifier command 1 50 cron.daily nice run-parts /etc/cron.daily(这里设置一下延时时间,这里的作用本来是为了避免同时发生多个任务造成负载过重) 7 25 cron.weeklynice run-parts /etc/cron.weekly @monthly 45 cron.monthlynice run-parts /etc/cron.monthly
- 应用程序重新打开日志文件
- 以Nginx为例,是通过postrotate指令发送USR1信号来通知Nginx重新打开日志文件的。但是其他的应用程序不一定遵循这样的约定,比如说MySql是通过flush-logs来重新打开日志文件的。还有些应用程序压根就没有提供类似的方法。此时如果想重新打开日志文件,就必须重启服务,但是为了高可用性,这往往不能接受。还好logrotate提供了一个名为copytruncate的指令,此方法采用的是先拷贝在清空的方式,整个过程中日志文件的操作句柄没有发生变化,所以不需要通知应用程序重新打开日志文件,但是需要注意的是,在拷贝和清空之间有一个时间差,所以可能会丢失部分数据。