定时清理日志的shell脚本

因为公司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]判断是否为文件;这里的判断需要绝对路径。

 

posted @ 2021-02-24 22:10  DoubleFishes  阅读(661)  评论(0编辑  收藏  举报