Logrotate 是 linux 系统用来分割日志的系统工具。Logrotate 可以设置为每天、每周、每月或当日志文件达到一定的大小时处理日志文件,提供自动压缩、删除、分割日志文件的功能。一般 Centos 系统已经自带安装好了。
问:为什么 Logrotate 会按照每天每周每月执行,因为定时任务会调用 cat /etc/cron.daily/logrotate 该脚本中下面这段命令
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
这段命令,会执行一次 Logrotate 的所有轮转任务。
问:调用 /etc/cron.daily/logrotate 该脚本的定时任务什么时候触发?
因为在 /etc/cron.daily 目录下的所有任务都会每天执行一次。
问:在 /etc/cron.daily下面定义的脚本是每天执行一次,但是我想知道一般是几点执行?这个时间是在哪里定义的,在哪里可以修改?
Linux anacron 会以 1 天、1周(7天)、一个月作为检测周期, anacron 会在特定的时间执行 /etc/cron.daily 和 /etc/cron.weekly 和 /etc/cron.monthly 这些定时任务。
那么,anacron 是如何判断这些定时任务已经超过执行时间的呢?这就需要借助 anacron 读取的时间记录文件。anacron 会分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,将两者进行比较,如果两个时间的差值超过 anacron 的指定时间差值(一般是 1 天、7 天和一个月),就说明有定时任务没有执行,这时 anacron 会介入并执行这个漏掉的定时任务,从而保证在关机时没有执行的定时任务不会被漏掉。
[root@mytest ~]# cat /etc/anacrontab
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 最大随机延迟45分钟,在开始执行任务前 再随机机延迟(45分钟之内)后才真正开始执行
# 任务不能同时执行,那样服务器的负载会非常大,目的是在触发任务45分钟之内,给每个触发的任务随机一个时间,一个一个来执行
RANDOM_DELAY=45
# 任务只在3:00~22:00时间范围内开始执行
START_HOURS_RANGE=3-22
# 周期(天) 延迟(分)作业标识符 命令
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
#每隔1天 延迟5分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那就执行
#每隔7天 延迟25分钟后检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被执行,那就执行
#每隔1月 延迟45分钟后检查/etc/cron.monthly 目录内的文件是否被执行,如果1月内没有被执行,那就执行
我们用上面配置文件中的cron.daily工作来说明下/etc/anacrontab的执行过程:
首先读取 /var/spool/anacron/cron.daily 中的上一次anacron执行的时间.
和当前时间比较,如果两个时间的差值超过1天,就执行cron.daily工作。
执行这个工作只能在03:00-22:00之间。
执行工作时强制延迟时间为5分钟,再随机延迟0-45分钟时间。
使用nice命令指定默认优先级,使用run-parts脚本执行/etc/cron.daily目录中的所有可执行文件。
1、服务器重启、开机后会让 anacron 重新生效。
2、修改上次执行时间 vi /var/spool/anacron/cron.daily 比如修改下面周期为1天的上次执行时间 会立即和当前时间比较,如果两个时间的差值超过1天,就执行cron.daily工作。
[root@oradb ~]# cat /var/spool/anacron/cron.daily
20220311
3、修改系统时间会让 anacron 重新生效。
date -s "2022-03-13 02:59:00"
问:Logrotate轮转日志会丢失日志数据吗?
会。支持发送重载信号的服务日志可以实现不丢失数据。源码分析logrotate切割日志的实现原理 – 峰云就她了
关于nginx日志分割中的kill -USR1 PID知识点整理_xinfuxuan4的博客-CSDN博客
若未安装使用如下命令安装logrotate
sudo yum install -y logrotate
/etc/logrotate.conf
/etc/logrotate.d/
logrotate.conf 全局配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。
另外,如果 /etc/logrotate.d/ 里面的文件中若没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。
在/etc/logrotate.d目录里的个性化配置文件的参数与全局配置文件的参数重复,会覆盖Logrotate的缺省值。
cat /etc/logrotate.conf
weekly # 每周转存一次
rotate 4 # 指定日志文件删除之前轮转的次数,即每次转存的时候会保留前3次的转存文件。
create # rotate后,创建一个新的空文件,指定logrotate自动建立新的日志文件,新的日志文件具有和原来的文件一样的权限。
dateext # 使用当期日期作为轮转日志的后缀名
include /etc/logrotate.d # 将 /etc/logrotate.d/ 目录中的所有文件都加载进来
#以下每个配置相当于/etc/logrotate.d/下的个性化配置
/var/log/wtmp { # 指定/var/log/wtmp日志文件;
monthly # 每月轮转一次,优先于全局设定的每周轮转一次;
minsize 1M # 日志文件大于1M才会去轮转;
create 0664 root utmp # 转储后文件不存在时创建它,文件所有者为root,所属组为utmp,对应的权限为0664
rotate 1 # 保留一个日志备份,优先于全局设置的四个;
}
/var/log/btmp { # 指定/var/log/btmp日志文件;
missingok # 如果日志丢失,不报错;
monthly
create 0600 root utmp
rotate 1
}
比如以系统日志/var/log/message做切割来简单说明下(rotate = 4 ):
第一次执行完rotate(转存)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;
第二次执行之后,messages.1会变成messages.2,messages会变成messages.1,又造成一个空的messages来储存日志!
第三次执行之后,messages.2会变成messages.3,messages.1会变成messages.2,messages会变成messages.1,又造成一个空的messages来储存日志!
第四次执行之后,messages.3会变成messages.4,messages.2会变成messages.3,messages.1会变成messages.2,messages会变成messages.1,又造成一个空的messages来储存日志!
如果仅设定保留4个日志(即轮转4次)的话,那么执行第四次时,则 messages.4这个档案就会被删除,也就是会保存最新的几个日志。
由 include /etc/logrotate.d 这个文件的设定可以知道/etc/logrotate.d其实就是由/etc/logrotate.conf 所规划出来的目录,虽然可以将所有的配置都写入 /etc/logrotate.conf ,但是这样一来这个文件就实在是太复杂了,尤其是当使用很多的服务在系统上面时, 每个服务都要去修改 /etc/logrotate.conf 的设定也似乎不太合理了。
所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中。
如下:我们的tomcat日志切割的配置文件会放在/etc/logrotate.d下面。
在/etc/logrotate.d/目录下创建Tomcat服务日志配置文件,假如我的Tomcat日志文件路径为:/home/test/tomcat/logs/catalina.out 该文件所属用户和组为xx
vi /etc/logrotate.d/tomcat
# 指定要切割的日志文件路径;多个文件路径之间换行即可,参考cat /etc/logrotate.d/syslog
/home/mytest/tomcat/logs/catalina.out
{
# xx为catalina.out文件所属用户
su root xx
daily # 每日轮转一次,优先于全局设定的每周轮转一次;
# rotate 60 保留60个日志备份,优先于全局设置的四个;下面这种参数有值时不要把注释加在后面,否则会报错
rotate 60
missingok # 如果日志丢失,不报错继续滚动下一个日志
dateext # 使用当期日期作为轮转日志的后缀名
compress # 通过gzip对转储以后的日志进行压缩
#notifempty # 空日志不进行轮转
copytruncate # 以先拷贝再清空的方式对当前日志进行备份并截断操作;由于拷贝和清空之间有一个时间差,可能会丢失部分日志数据
}
保存好配置文件后,可以执行以下命令测试(立即截断日志):
logrotate命令参数说明:
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。
测试 logrotate tomcat 配置文件是否有错误
logrotate -d /etc/logrotate.d/tomcat
若出现 -- skipping 需要注意是否配置错误
若上面检查没有错误,可以执行以下命令测试(立即截断日志):
logrotate -vf /etc/logrotate.d/tomcat
在 /home/mytest/tomcat/logs/ 目录下看到切割后的文件即表示配置成功。
测试 logrotate 全局配置文件是否有错误
logrotate -d /etc/logrotate.d
在某些情况下一天一次满足不了我们情况,就可以使用创建crontab定时任务手动调用这个命令,让他按照我们想要的时间点去切割。
crontab -e
#每隔1小时执行一次
0 */1 * * * /home/mytest/logrotate-tomcat.sh
vi /home/mytest/logrotate-tomcat.sh
logrotate -vf /etc/logrotate.d/tomcat
compress:通过gzip对转储以后的日志进行压缩
nocompress:不对日志进行gzip压缩处理
copytruncate:用于处理还在打开中的日志文件,以先拷贝再清空的方式对当前日志进行备份并截断操作;由于拷贝和清空之间有一个时间差,可能会丢失部分日志数据
nocopytruncate:备份日志文件但不进行截断操作
create mode owner group:轮转时指定创建新文件,可指定权限、属主和属组
nocreate:日志轮转后不创建新的日志文件
delaycompress:发生轮转的日志文件到下一次转储时才压缩
nodelaycompress:日志轮转同时进行压缩
missingok:如果日志丢失,忽略此日志不产生报错
errors address:轮转时产生的错误信息发送到指定的Email地址
ifempty:空日志也进行日志轮转
notifempty:空日志不进行轮转
olddir directory:轮转后的日志文件放入指定的目录,指定目录和当前日志文件需要在同一个文件系统
noolddir:轮转后的日志文件和当前日志文件放在同一个目录下
sharedscripts:所有日志都轮转后统一执行postrotate脚本
prerotate:在logrotate轮转之前需要执行的指令,如修改文件的属性
postrotate:在logrotate转储之后需要执行的指令,如重启(kill -HUP)服务
daily:指定轮转周期为每天
weekly:指定轮转周期为每周
monthly:指定轮转周期为每月
rotate count:指定日志文件删除之前轮转的次数,0:没有备份,5:保留5个备份
dateext:使用当期日期作为轮转日志的后缀名
dateformat .%s:配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,只支持 %Y %m %d %s 这四个参数
size(或minsize) log-size:当日志文件到达指定的大小时才轮转,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
当日志文件 >= log-size 的时候就轮转
size = 5 或 size 5 (>= 5 个字节就轮转)
size = 100k 或 size 100k
size = 100M 或 size 100M
Centos7配置logrotate日志轮转_xixixilalalahaha的博客-CSDN博客_centos7 logrotate