众所周知日志是记录用户的操作和做的改变,随着时间的增加日志文件会变得越来越大,那么就会占据本地的空间,影像系统。
日志轮转系统就是解决这个问题的方案之一,简单来说就是将日志定期作备份重新存储为一个文件,达到一定时间跨度后旧的文件就会被覆盖掉。以此来解决的日志文件过大的问题。
就是logrotate 这个东西。
rsyslog负责写日志,记录日志;logrotate负责备份,删除日志。
查看下这个软件都装了什么文件
[root@gsc666 ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/etc/rwtab.d/logrotate
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate
/var/lib/logrotate/logrotate.status
很明显,第一个在cron.daily 目录下,是计划任务的,每天执行一次。daily嘛。
[root@gsc666 ~]# 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
很明显是一个脚本,并且是查看状态在发送一个日志。
/etc/logrotate.conf
日志轮转的主配置文件,主要是写了一些命令,默认全局生效的。
有这样一条# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
表示在/logrotate.d这个目录下都生效。
意思是将日志按照功能分开,以防一个日志文件过长,给读取造成困难。类似子配置文件,标记一个目录指向和存放这些文件,其实本质上和直接写在主配置文件中一样。
# see "man logrotate" for details
# rotate log files weekly
weekly //每周轮转
# keep 4 weeks worth of backlogs
rotate 4 //保存4份
# create new (empty) log files after rotating old ones
create //创建新的空文件来替换旧的
# use date as a suffix of the rotated file
dateext //在旧的文件后加上日期
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d //配置文件的目录,就是上边说的那个
# no packages own wtmp and btmp -- we'll rotate them here
//给某个软件单独配置属于自己的规则
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
可以自己创建一个日志文件,来做演示。
创建一个启动的日志。
[root@gsc666 ~]# vi /etc/rsyslog.conf
[root@gsc666 ~]# systemctl restart rsyslog
[root@gsc666 ~]# logger -is -p local1.info "test log 2"
root[13562]: test log 2
[root@gsc666 ~]# cat /var/log/local1.log
Oct 25 19:05:49 gsc666 root[13562]: test log 2
# Save boot messages also to boot.log
local7.* /var/log/boot.log
local1.* /var/log/local1.log
//最后的local1 就是这次添加的,配置文件是rsyslog.conf
到这里日志的记录就达成了,现在进行的是日志的轮转。
[root@gsc666 ~]# chattr +a /var/log/local1.log
先加个文件属性权限吧,为了后续的一个东西。
配置轮转的配置文件,就用单个文件的规则吧。
[root@gsc666 ~]# vi /etc/logrotate.d/local1
配置文件这样写:
/var/log/local1.log { //指定一个要操作的日志文件
prerotate //轮转前要做的事
chattr -a /var/log/local1.log //去掉文件属性权限
endscript
missingok //丢失不提醒
rotate 3 //保存3份
daily //每日轮转
create 0600 root root //创建轮转日志文件的权限和属组属主
postrotate //轮转后要做的事
chattr +a /var/log/local1.log
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true //初始化轮转的服务,重新读配置文件等。重要!!!
mv /var/log/local1.log.1 /var/log/"local1.log.`date "+%s"`" // 给生成的文件重命名,打上时间戳
endscript
}
prerotate ,之前那个就是为了这个,在轮转前可以做一些操作。
开始测试:
[root@gsc666 ~]# logger -is -p local1.info "test log 6" //手动发个日志
root[13897]: test log 6
[root@gsc666 ~]# logrotate -f /etc/logrotate.d/local1 //强制轮转 后边指定的是“子”的配置文件
[root@gsc666 ~]# ls /var/log/local1* //查看日志的文件,发现有2个,一个是新生成的,一个是旧的已经轮转下来了,并且名字改变了
/var/log/local1.log /var/log/local1.log.1572003075
[root@gsc666 ~]# cat /var/log/local1.log.1572003075
Oct 25 19:05:49 gsc666 root[13562]: test log 2
Oct 25 19:22:36 gsc666 root[13784]: test log 3
Oct 25 19:27:17 gsc666 root[13845]: test log 4
Oct 25 19:29:05 gsc666 root[13861]: test log 5
Oct 25 19:31:02 gsc666 root[13897]: test log 6
[root@gsc666 ~]#
//并且在这里可以看到之前的日志内容,证明这个是之前存日志的文件。
日志轮转由计划任务控制,但是具体在什么时候执行,由下边的文件控制。
[root@localhost ~ ]# vim /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
和这个文件
[root@localhost ~ ]# 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
至于为什么要初始化呢????
因为日志轮转前,日志记录到一个文件中,识别这个文件的inode,这时进行轮转生成了一个新的文件,但是日志还是记录到旧的文件中,这是不对的,就需要重新读一下,让系统知道,新的文件的名字,和inode。这样才能备份旧的文件,并且日志记录到新的文件中。
PS:驱动主配置文件也可以强制轮转,生成的文件后也有时间戳不过和我的规则不同,没有log.1这个文件所以报错,不过不影响,轮转文件也生成了。
[root@gsc666 ~]# logrotate -f /etc/logrotate.conf
mv: cannot stat ‘/var/log/local1.log.1’: No such file or directory
error: error running non-shared postrotate script for /var/log/local1.log of '/var/log/local1.log '
[root@gsc666 ~]# ls /var/log/local1*
/var/log/local1.log /var/log/local1.log.1572003075 /var/log/local1.log-20191025
PS : logdotate 的属性
compress 通过gzip 压缩转储以后的日志
nocompress 不做gzip压缩处理
create mode owner group 轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate 不建立新的日志文件
delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
missingok 如果日志丢失,不报错继续滚动下一个日志
ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty 当日志文件为空时,不进行轮转
mail address 把转储的日志文件发送到指定的E-mail 地址
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
dateext 使用当期日期作为命名格式
dateformat .%s 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合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
如果设置了size,会无视 daily, weekly,monthly 指令,所以size的优先级比较高