Logrotate日志管理工具

logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除超过6个月的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。
logrotate项目地址:https://github.com/logrotate/logrotate

安装Logrotate切割工具

yum install logrotate.x86_64 crontabs.noarch -y

logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,放在/etc/logrotate.d/目录下。

Logrotate 配置文件详解

1.logrotate文件说明
主配置文件如下所示,主配置文件中定义的配置参数为全局参数,主配置文件中包含了 /etc/logrotate.d/ 目录,一般我们在 /etc/logrotate.d目录中进行配置相应的切割。我们在 /etc/logrotate.d 目录中定义的配置 覆盖全局定义。

[root@nginx_proxy02 ~]# rpm -ql logrotate
/etc/cron.daily/logrotate                       #logrotate定时任务
/etc/logrotate.conf                             #主配置文件
/etc/logrotate.d                                #配置切割文件目录
/var/lib/logrotate/logrotate.status             #默认的logrotate日志切割的状态文件

2.配置参数详解

#压缩配置
compress                #经过切割或者旋转后的日志文件进行 gzip 压缩
nocompress              #经过切割或者旋转后的日志文件不进行压缩
compresscmd             #指定使用哪个命令来压缩日志文件,默认是gzip
uncompresscmd           #指定要使用哪个命令解压日志文件,默认是gunzip
compressext             #指定要在压缩日志文件上使用的扩展名,如果启用了压缩,默认设置与配置的压缩命令相同
compressoptions         #压缩级别选项,对于gzip压缩,默认级别为 -6 ,超高压缩比,不过速度较慢
delaycompress           #将前一个日志文件的压缩推迟到下一个旋转周期,开启 compress 时生效
nodelaycompress         #不要将前一个日志文件的压缩推迟到下一个循环周期

#复制配置
copy                    #复制一份日志文件并不改变源文件
nocopy                  #不复制源日志文件,并将其放在适当的位置
copytruncate            #复制一份日志文件后将源日志文件清空
nocopytruncate          #复制一份日志文件后不清空源日志文件

#创建配置
create mode owner group #在日志切割之后和运行 postrotate 脚本之前,立刻创建与刚切割同名的日志文件,mode 选项为 chmod 命令指定的权限选型,如 644;owener 指定创建日志文件的所有者,group指定所属组。
nocreate                #禁用create mode owner group参数

#切割时间
daily                   #日志以天切割
weekly                  #日志以周切割,日志每个工作日切割一次,或者日期比上次至少提前7天
monthly                 #日志以月分隔,通常是每月的第一天
yearly                  #日志以年切割

#切割扩展名
dateext                 #归档切割后的日志文件,添加一个日期扩展名,如YYYYMMDD,而不是简单地添加一个数字。扩展需要使用dateformat或dateyesterday选项配置
nodateext               #不要使用日期扩展来存档旧版本的日志文件
dateformat              #默认值为-%Y%m%d,但每小时使用-%Y%m%d%H作为默认值。
dateyesterday           #使用昨天的日期而不是今天的日期来创建dateext扩展,以便旋转后的日志文件的名称中有一个日期,该日期与其中的时间戳相同

#日志大小
size                    #日志分割不按照时间来,而是按照日志大小来分割
minisize                #在按照时间分割的时候,如果日志大小超过该数值,则分割;否则,略过
maxsize                 #在日志大小达到这个的时候,无论时间到没到这里分割,都触发分割
notifempty              #如果日志文件为空,则不进行切割
ifempty                 #即使日志文件为空,也要照常切割它

#执行命令
postrotate/endscript    #在日志切割后,logrotate将使用/bin/sh,执行postrotate和endscript之间的命令
prerotate/endscript     #在日志切割前,logrotate将使用/bin/sh,执行prerotate和endscript之间的命令

#其它
rotate count            #指定保留的日志文件个数
olddir directory        #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
missingok               #如果日志文件丢失,则继续到下一个文件而不发出错误消息。
include                 #包含指定路径的文件

3.Logrotate 命令选项

logrotate --help                 #查看帮助
logrotate [-d|--debug]           #打开调试模式,在调试模式下,不会对日志或logrotate状态文件进行任何更改
logrotate [-f|--force]           #强制旋转,即使定义的配置文件还不到旋转阈值
logrotate [-s|--state statefile] #指定logrotate自身打印的状态文件路径,对于多个日志切割配置所属不同的用户还是很有用的。
logrotate [-v|--verbose]         #显示详细信息
logrotate [-l|--log STRING]      #指定日志文件路径
logrotate --version              #显示版本

Logrotate切割Nginx日志

切割方式一

[root@nginx_proxy02 /]# vim /etc/logrotate.d/nginx
#按天复制清空切割
/usr/local/nginx/logs/*.log {
        daily                               
        rotate 30
        missingok
        notifempty
        compress
        nodelaycompress
        copytruncate
        dateext
        dateformat -%Y-%m-%d
        dateyesterday
}

配置解析:
#按天切割|保留30个日志文件|切割中遇到日志错误忽略|日志如果为空将不进行切割和压缩|
#以gzip方式压缩|不要将刚切割后的日志文件放到下个循环中进行压缩|复制源日志文件后并清空源日志文件|
#切割后的文件添加日志扩展名|扩展方式为 -%Y-%m-%d|切割后的文件日志命名为昨天的日期|

#手动执行切割(我们做测试使用)
1.写入30M内容
[root@nginx_proxy02 logs]# head -c 30M < /dev/urandom > /usr/local/nginx/logs/error.log
[root@nginx_proxy02 logs]# head -c 30M < /dev/urandom > /usr/local/nginx/logs/access.log
[root@nginx_proxy02 logs]# head -c 30M < /dev/urandom > /usr/local/nginx/logs/access.json

2.强制执行切割(不管是否到了任务计划自动执行时间)
[root@nginx_proxy02 logs]# logrotate -vf /etc/logrotate.d/nginx
-v 显示切割过程中的详细信息
-f 强制执行切割

3.查看切割效果
[root@nginx_proxy02 logs]# ls -lrth
total 91M
-rw-r--r-- 1 nginx root 31M Mar 25 17:09 error.log-2020-03-24.gz
-rw-r--r-- 1 nginx root 31M Mar 25 17:09 access.log-2020-03-24.gz
-rw-r--r-- 1 nginx root 30M Mar 25 17:09 access.json
-rw-r--r-- 1 nginx root   0 Mar 25 17:11 access.log
-rw-r--r-- 1 nginx root   0 Mar 25 17:11 error.log

切割方式二

[root@nginx_proxy02 /]# vim /etc/logrotate.d/nginx
#向Nginx发送信号重新打开日志文件切割
/usr/local/nginx/logs/*.log {
        daily
        rotate 30
        missingok
        notifempty
        compress
        nodelaycompress
        dateext
        dateformat -%Y-%m-%d
        dateyesterday
        postrotate
            if [ -f /usr/local/nginx/run/nginx.pid ];then
                kill -USR1 `cat /usr/local/nginx/run/nginx.pid`
            fi
        endscript
}

配置解析:
#按天切割|保留30个日志文件|切割中遇到日志错误忽略|日志如果为空将不进行切割和压缩|
#以gzip方式压缩|不要将刚切割后的日志文件放到下个循环中进行压缩|
#切割后的文件添加日志扩展名|扩展方式为 -%Y-%m-%d|切割后的文件日志命名为昨天的日期|
#在切割后执行 postrotate / endscript 之间的命令,向nginx发送信号重新打开日志

切割方式三

#不同格式文件大小切割
"/usr/local/nginx/logs/access.log" "/usr/local/nginx/logs/error.log" /usr/local/nginx/logs/access.json {
        size 100M
        rotate 30
        missingok
        notifempty
        compress
        nodelaycompress
        copytruncate
        dateext
        dateformat -%Y-%m-%d-%H
}

配置解析:
与上两种方法区别为把 daily 参数改为了 size 参数,取消了 dateyesterday 参数

切割时间
上面讲logrotate按时间切割有 天|周|月|年,可具体时间是几点钟?
logrotate默认的定时任务放在了 /etc/cron.daily/logrotate 文件中

[root@nginx_proxy02 logs]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

可是上面脚本中只写入了执行 /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf logotate的命令,然后下面有一个判断执行是否成功,并没有时间,这该去哪里找?
logrotate的行为也是受crontab控制,而crontab任务是手anacron控制,所以来看anacrontab

[root@nginx_proxy02 logs]# cat /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=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22          

#period in days   delay in minutes   job-identifier   command
1   5   cron.daily      nice run-parts /etc/cron.daily
7   25  cron.weekly     nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly        nice run-parts /etc/cron.monthly

所有系统级别的计划任务都是在上面脚本 START_HOURS_RANGE= 指定的时间点内执行,3-22 表示每天的凌晨 3点-22点内,随机执行,是不是很扯淡,别着急往下看。
我们可以修改 START_HOURS_RANGE= 23-24 (这是日志切割时间点,即只在23点到24点开始切割,不出意外就是23点啦),当然我们可以自己写crontab任务,不过要把 logrotate 的任务计划给删掉。然后在每天凌晨00:00进行切割nginx日志

[root@nginx_proxy02 logs]# rm -rf /etc/cron.daily/logrotate
[root@nginx_proxy02 logs]# crontab -e
#Nginx logs cut
00 00 * * * /sbin/logrotate -f /etc/logrotate.d/nginx

这样就可以了







「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论