背景
在生产过程中,由于磁盘空间、保留周期等因素,会对系统、应用等日志提出要求,要求系统日志定期进行轮转、压缩和删除,从而减少开销,而系统自带的logrotate
则是一个简单又实用的小工具,下面着重介绍一下,满足日常需求。
语法
Usage: logrotate [OPTION...] <configfile>
常用参数 :
-f
非设定周期内强制运行
-d
调试,对日志模拟进行操作
-v
可视化执行过程结果
其它参数不常用,详情见下:
[root@test01 ~]# logrotate --help Usage: logrotate [OPTION...] <configfile> -d, --debug Don't do anything, just test (implies -v) -f, --force Force file rotation -m, --mail=command Command to send mail (instead of `/bin/mail') -s, --state=statefile Path of state file -v, --verbose Display messages during rotation -l, --log=STRING Log file --version Display version information Help options: -?, --help Show this help message --usage Display brief usage message [root@test01 ~]#
配置文件
logrotate 配置主要有两个
- 常规主配置文件地址
/etc/logrotate.conf
不建议对其修改 - 自定义配置文件
/etc/logrotate.d
这里存放用户自定义文件,通常建议将个人文件放到这里
[root@test01 ~]# cd /etc/logrotate.d/ [root@test01 logrotate.d]# ll total 16 -rw-r--r--. 1 root root 91 Aug 6 2019 bootlog -rw-r--r--. 1 root root 224 Aug 6 2019 syslog -rw-r--r--. 1 root root 100 Oct 31 2018 wpa_supplicant -rw-r--r--. 1 root root 103 Aug 8 2019 yum [root@test01 logrotate.d]#
为保证 /etc/logrotate.d
定义的文件能够执行生效,需要确保 /etc/logrotate.conf
这句话没有注释,如有注释,需手动取消:
# RPM packages drop log rotation information into this directory include /etc/logrotate.d
配置文件demo及参数
以下是我个人一个配置文件,可以直接拿来结合自己需求进行修改:
/var/log/linuxserver/linux.log { rotate 7 size 200M daily compress delaycompress missingok notifempty noolddir copytruncate dateext dateformat .%s create 660 root root }
文件格式主要是以日志路径和日志切割参数组成:
第一行:指明 需要进行切割的日志路径,可以结合正则表达式,例如 /path/*.log
,指定路径下所有的日志
第二行:以{ }
包含logrotate
所需要的参数,demo包含了基本常用到的几个参数,此外还有如下部分参数,参数含义如下:
# 日志压缩参数 compress 通过gzip 压缩转储以后的日志 delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩 nodelaycompress 覆盖 delaycompress 选项,转储同时压缩 nocompress 不做gzip压缩处理 # 对截断后的日志处理参数 copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 nocopytruncate 备份日志文件不过不截断 create mode owner group 轮转时指定创建新文件的属性,如create 0777 nobody nobody nocreate 不建立新的日志文件 dateext 使用当期日期作为命名格式 dateformat .%s 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数 # 基本参数 missingok 如果日志丢失,不报错继续滚动下一个日志 errors address 专储时的错误信息发送到指定的Email 地址 ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。 notifempty 当日志文件为空时,不进行轮转 mail address 把转储的日志文件发送到指定的E-mail 地址 nomail 转储时不发送日志文件 # 旧日志存放参数 olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 noolddir 转储后的日志文件和当前日志文件放在同一个目录下 # logrotate 执行前后钩子参数 sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 prerotate 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行 postrotate 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行 # 执行周期参数 daily 指定转储周期为每天 weekly 指定转储周期为每周 monthly 指定转储周期为每月 # logrotate 触发条件参数 rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 size(或minsize) log-size 当日志文件到达指定的大小M、G时才转储
执行触发时间
logrotate
默认走的是crond
服务 ,执行语句脚本存放在/etc/cron.daily/
目录下,主要脚本:/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
默认触发时间配置文件存在 /etc/anacrontab
,默认执行时间 每日3.45-22.45 时间段随机执行一次。缺点是具体执行时间不容易掌握,通常不建议用户对该文件进行修改,如果需要定期执行,建议用户可以在vim /etc/crontab
或 crontab -e
按照crond
格式设定执行时间,以便更好的分配脚本执行时间,避免机器资源集中使用,减少机器负载。