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的指令,此方法采用的是先拷贝在清空的方式,整个过程中日志文件的操作句柄没有发生变化,所以不需要通知应用程序重新打开日志文件,但是需要注意的是,在拷贝和清空之间有一个时间差,所以可能会丢失部分数据。
posted @ 2017-07-04 12:11  zane_zong  阅读(415)  评论(0编辑  收藏  举报