当前位置: 首页 > 工具软件 > logrotate > 使用案例 >

Linux Logrotate日志切割管理

颛孙庆
2023-12-01

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的缺省值。

查看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下面。

切割Tomcat日志

在/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

 类似资料: