下面是一个简单的logrotate日志转存脚本,它会在每小时检查一次日志文件大小,如果文件大小大于3M,则将日志文件转存到一个新的文件中,并将原始日志文件压缩并重命名为历史文件。
步骤:
1、在/etc/logrotate.d目录下新建app_log
2、在/etc/usr/local目录下创建日志转存命令及自动删除旧文件脚本log_bak.sh
cd /usr/local
vi log_bak.sh
chmod +x log_bak.sh //赋予脚本执行权限
3、创建执行脚本定时任务 crontab -e //进入定时任务编辑页面 按i进行编辑 在文件最下方加入定时任务。
/usr/local/app.log {
hourly
size 10M
notifempty
compress
copytruncate
olddir /var/log/app_bak/
dateext
dateformat -%Y%m%d%H.%s
missingok
rotate 7
create 0644 root root
}
hourly 指定rotate周期为每天,还有weekly, monthly。
rotate count 指定rotate日志文件保留的数量,如果没有配置这个参数,就不保留备份,设置1的话,就是保 留1个rotate备份,10就是保留10个rotate备份。
size size 当日志文件到达指定的大小时才转储,默认的大小单位是bytes,可以以k,M,G。比如size 10k, 10M, 10G。
compress 通过gzip压缩然后备份日志。
copytruncate 把当前日志备份并截断,先拷贝原日志文件再清空,由于拷贝和清空之间有一个时间差,可能会丢失部 分日志数据。
notifempty #当日志文件为空时,不进行轮转
missingok #如果日志丢失,不报错继续滚动下一个日志
create mode owner group rotate之后,创建新文件的日志文件并指定新文件的属性,比如:
create 644 tomcat tomcat
olddir directory #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
dateext 使用当期日期作为命名格式,如果指定的rotate大于1,默认rotate之后的文件名是:xx.log.1, xx.log.2, xx.log3,如果配置dateext规则,那么rotate之后的文件名就会以日期结 尾:xx.log.2020-04-20,xx.log.2020-04-21, xx.log.2020-04-22
dateformat -%Y%m%d%H.%s 定义文件rotate后的文件名的日期格式,必须配合dateext使用,查了一下资料,目前只支持: %Y %m %d %H %s 这几个个参数(年,月,日,时,秒)
这个脚本会在每小时检查一次日志文件大小,如果文件大小大于3MB,则会将日志文件复制到一个新的文件中,并压缩该文件以节省空间。然后,它会清空原始日志文件,以便开始新的日志记录。
log_bak.sh脚本命令:
#!/bin/bash
[ ! -e /var/log/app_bak ] && mkdir /var/log/app_bak
find /var/log/app_bak/ -mtime +2 -type f -exec rm -rf {} \; //保留最近3天的数据
将该脚本添加到crontab中,以便每小时自动执行。您可以使用以下命令将其添加到当前用户的crontab中:
crontab -e
然后,添加以下行以在每小时的第0分钟运行日志转存脚本以及日志删除脚本定时任务:
*/60 * * * * root /usr/sbin/logrotate -vf /etc/logrotate.d/app_log //每1小时执行一次
0 1 * * * root /usr/local/log_bak.sh //每天凌晨1点执行日志删除命令
完成。