因为公司springcloud项目各个server的日志堆积日益增多占据服务器内存,故提出了定时清理7天之外的日志需求。
场景:
日志目录结构:/logs/server_name/date/date_1.log
shell代码:
1 #!/bin/bash 2 echo "hello world" 3 4 dir="/logs" 5 6 dt=`date +%Y%m%d -d "7 day ago"` 7 8 9 # 删除子目录下的过期log日志 10 removeLogs() { 11 for filename in `ls $1`; 12 do 13 array=(${filename//-/ }) 14 15 year=${array[1]} 16 month=${array[2]} 17 days=${array[3]} 18 day_array=(${days//./ }) 19 day=${day_array[0]} 20 21 subdir_day=$year$month$day 22 23 if [ "${subdir_day}" < "${dt}" ] 24 then 25 echo "the log $filename has been cleaned." 26 rm -rf $1/$filename >/dev/null 27 fi 28 done 29 } 30 31 # 因为日志目录格式为/logs/excel嵌套了两层,所以用了2层for循环 32 for sub1 in `ls $dir`; 33 do 34 if [ -d $sub1 ]; 35 then 36 for sub2 in `ls $sub1`; 37 do 38 file=$dir"/"$sub1"/"$sub2 39 40 if [ -d $file ]; # 需要绝对路径 41 then 42 removeLogs $file 43 fi 44 45 done 46 fi 47 done
代码部分解释:
`date + %Y%m%d -d "7 days ago"` 将当前日期往前推7天,并且输出为年月日的格式。例如:20210217。
array=(${filename//-/ }) 将命名如'dispatchorder-2021-02-12.0.log'的日志,根据'-'将文件名分割成数组:[dispatchorder,2021,02,12.0.log]。
year=${array[1]} 取出数组的第二个元素,并将值赋给变量year。
rm -rf $1/$filename >/dev/null $1接收的是调用函数时传递过来的第一个参数;rm -rf $fullfilename >/dev/null 根据全路径名清空文件。
if [-d $sub1] 如果变量是文件夹;同理[-f $sub1]判断是否为文件;这里的判断需要绝对路径。