日志切割是一个很常见的需求,一般就是两种方式,一个是脚本陪着计划任务,另一个就是logrotate 实现。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。
自定义日志切割的配置文件放在/etc/logrotate.d/下面
cat alg.log
/logs/alg/scheduler/info.log { #切割的日志名字
daily #每天切割
missingok #忽律报错
copytruncate #一种切割方案,把目标日志先复制一份,然后再清空原日志,新的数据继续写入愿日志文件,因为只是晴空,inde 信息不变。注意此方案的一缺点就是会短时间把占用大量空间,因为当复制新备份日志过程中还没有清空久的日志那时候空间就反而占用多了。
maxage 90 #最大保留90天的切割文件,rotate 90 表示保留90个文件
rotate 30 #最多保留最新的30个切割日志,这个与上面的maxage通常使用其中之一
compress #压缩切割的日志(gzip)
delaycompress #不压缩当前切割的日志,压缩上一次的切割日志,方便查看最新的切割日志
notifempty #空的文件不切割
sharedscripts
dateext
dateformat -%Y-%m-%d-%s #切割文件的格式
size=10M #每天切割大于10M 的日志,不足10M不切割
postrotate #切割后的操作,通常做一些例如移动压缩日志到备份目录,发送信号给nginx等进程重新加载配置等操作
mv /logs/alg/scheduler/info.log-* /logs/alg/scheduler/logrotate
endscript
}
测试验证
logrotate -d /etc/logrotate.d/alg.log #-d 表示调试,通过输出查看验证配置,实际并不执行,去掉-d 实际会执行。
轮转后的日志在/logs/alg/scheduler/logrotate/下以压缩包的形式存在,通过gzip -d 可以解压后查看
其他参数
-
-f, --force :强制转储文件,即使文件大小不满足配置中的切割的阀值。
-
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-
-s, --state=statefile :使用指定的状态文件。
-
-v, --verbose :显示转储过程。
计划任务执行logrotate
只要安装了crontab 后再安装logrotate 那么就会有下面的配置文件生成,cron.daily目录下的文件都是每天执行的。
sudo 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
注:logrotate 命令后面是/etc/logrotate.conf 表示切割所有配置在/etc/logrotate.d/下配置的日志切割,如果只是切割某一个文件配置,就指定那个配置文件logrotate /etc/logrotate.d/test
当然如果你的日志量很大,那么你也可以每小时切割一次,只需要手动把上面文件复制到/etc/cron.hourly/ 目录即可。
通配符切割多个目录日志文件
如果你有多个日志分别存储在多个目录下面都需要切割,那么可以使用通配符。
/logs/namespace/payment/*/*.log { ... }
例如你的日志路径经过了细致的分类,根据命名空间+服务类别+服务目录这样划分路径的,那么就可以通过上面通配符切割,上面配置匹配的是如下内容:
/logs/namespace/payment/app1/*.log
/logs/namespace/payment/app1/*.log
...
当然也可以这样
/logs/namespace/*/*/*.log { ... }
/logs/namespace/payment/app1/*.log
/logs/namespace/payment/app1/*.log
...
/logs/namespace/shop/app1/*.log
/logs/namespace/shop/app1/*.log
...
也可以多个路径一起
/logs/namespace/*/*/*.log /logs/namespace/*/*/*/*/*.log { ... }
#空格间隔
问题处理
1、每个配置配置以后最好通过-d 测试运行一下,因为可能会有问题导致后期不运行切割,例如如果目录属组是work ,但是用root 切割那么就会导致报错而停止运行。
2、注意日志文件名字要有统一格式,比如约定所有日志都是*.log结尾,那么切割的时候也这么匹配就不会误操作而切割别的文件。当然日志路径也是需要有规律防止漏掉。