shell脚本实现删除历史日志的四种情况
删除历史日志是经常碰到的问题,总结一下大概有四种情况。注明:shell不支持代码后跟注释,我添加的注释只是为了理解,请使用时留意。
第一种:
日志在命名的时候已经添加了时间戳,删除N天前的日志,以15天为例。时间戳以yyyy-mm-dd为例。
代码:
Forder="/../logs" #日志路径,自己定义
rm -rf $Folder/*`date -d -15day +%Y-%m-%d`* #删除15天前的
rm -rf $Folder/*`date -d -16day +%Y-%m-%d`* #删除16天前的
rm -rf $Folder/*`date -d -17day +%Y-%m-%d`* #删除17天前的,设置为每天执行一次,删除后延3天的就够了。
这个命令的优势是占用内存极小,不需要检索,直接定位,推荐使用。当然前提是得有一个良好的命名习惯。
第二种:
日志在命名的时候没有添加时间戳,删除N天前的日志,以15天为例。
代码:
Forder="/../logs" #日志路径,自己定义
find $Forder/ -mtime +15 -name "*.log" -exec rm -rf {} \;
第三种:每天的个别日志增长量过大,需要删除部分日志文本内容,保留最新的一部分,以保留最新的5000行为例。
代码:
#脚本功能:删除服务器日志文本冗余的行,保留最新的5000行。
Folder="/../logs" #日志路径,自己定义
all_lines=`cat $Folder/filename.log | wc -l` #定义总行
del_lines=`expr $all_lines - 5000` #定义要删除的边界行
sed -i 1,${del_lines}d $catalina_Folder/filename.log #删除行
第四种:
每天的日志不是一个完整的文本,是由多个小文件构成,且命名为数字递增型。
例如某一天的日志命名为:1.log、2.log、3.log……………….n.log
我们的需要做的是只保留最后的一部分,以20个为例。
代码:
#脚本功能:删除服务器当天的冗余日志,保留20个最近的日志。
Folder="/../`date +%Y-%m-%d`" #获取当天日志路径,请自定义,非标准。
max=0
#将文件名称的最大值取出
for file_a in ${Folder}/*;do
file_names=`basename $file_a | awk -F '.' '{print $1}'`
if [ $file_names -gt $max ]
then
max=$file_names
fi
done
#保留20个
delnumber=`expr $max - 20`
#将其他的删掉
for ((i=1;i<${delnumber};i++));do
rm -rf ${Folder}/${i}.log
done
结束。