具体场景:
Tomcat应用服务器产生的日志量非常大,如果不及时处理其日志,会导致服务器磁盘被塞满,从而导致应用程序无法继续正常运行。针对以上问题我们可以按照一定规则对其日志进行处理(可以是移走,也可以是删除)。
规则:当Tomcat日志路径下所有日志文件总大小超过xx兆时,删除掉日期最早的日志文件,这样可以保证硬盘空间的相对稳定,也保留最近期的日志文件。
解答:
命令行测试
[root@myhost logs]# pwd
/usr/local/tomcat/logs
[root@myhost logs]# ll
总用量 34244
-rw-r--r--. 1 test root 38865 2月 26 15:12 catalina.2019-02-26.log
-rw-r--r--. 1 test root 1035 2月 28 10:44 catalina.2019-02-28.log
-rw-r--r--. 1 test root 4136 3月 2 09:38 catalina.2019-03-02.log
-rw-r--r--. 1 test root 65729 3月 5 09:46 catalina.out
-rw-r--r--. 1 test root 0 2月 26 15:11 host-manager.2019-02-26.log
-rw-r--r--. 1 test root 903 2月 26 15:12 localhost.2019-02-26.log
-rw-r--r--. 1 test root 3902958 2月 27 00:00 localhost_access_log.2019-02-26.txt
-rw-r--r--. 1 test root 8856907 2月 27 23:59 localhost_access_log.2019-02-27.txt
-rw-r--r--. 1 test root 6136397 3月 1 00:00 localhost_access_log.2019-02-28.txt
-rw-r--r--. 1 test root 3874887 3月 2 00:00 localhost_access_log.2019-03-01.txt
-rw-r--r--. 1 test root 3632150 3月 3 00:00 localhost_access_log.2019-03-02.txt
-rw-r--r--. 1 test root 3263432 3月 4 00:00 localhost_access_log.2019-03-03.txt
-rw-r--r--. 1 test root 3275050 3月 5 00:00 localhost_access_log.2019-03-04.txt
-rw-r--r--. 1 test root 1966372 3月 5 14:21 localhost_access_log.2019-03-05.txt
-rw-r--r--. 1 test root 0 2月 26 15:11 manager.2019-02-26.log
[root@myhost logs]# du -sm ./*
1 ./catalina.2019-02-26.log
1 ./catalina.2019-02-28.log
1 ./catalina.2019-03-02.log
1 ./catalina.out
0 ./host-manager.2019-02-26.log
1 ./localhost.2019-02-26.log
4 ./localhost_access_log.2019-02-26.txt
9 ./localhost_access_log.2019-02-27.txt
6 ./localhost_access_log.2019-02-28.txt
4 ./localhost_access_log.2019-03-01.txt
4 ./localhost_access_log.2019-03-02.txt
4 ./localhost_access_log.2019-03-03.txt
4 ./localhost_access_log.2019-03-04.txt
2 ./localhost_access_log.2019-03-05.txt
0 ./manager.2019-02-26.log
[root@myhost logs]# du -sh ./*
40K ./catalina.2019-02-26.log
4.0K ./catalina.2019-02-28.log
8.0K ./catalina.2019-03-02.log
72K ./catalina.out
0 ./host-manager.2019-02-26.log
4.0K ./localhost.2019-02-26.log
3.8M ./localhost_access_log.2019-02-26.txt
8.5M ./localhost_access_log.2019-02-27.txt
5.9M ./localhost_access_log.2019-02-28.txt
3.7M ./localhost_access_log.2019-03-01.txt
3.5M ./localhost_access_log.2019-03-02.txt
3.2M ./localhost_access_log.2019-03-03.txt
3.2M ./localhost_access_log.2019-03-04.txt
2.0M ./localhost_access_log.2019-03-05.txt
0 ./manager.2019-02-26.log
[root@myhost logs]# du -sh
34M .
[root@myhost logs]# du -sm
34 .
脚本实现
[root@myhost logs]# /home/script/logpath_monitor.sh
#!/bin/bash
source /etc/profile
#define variables
#指定日志所在路径
log_path="/home/apache-tomcat-7.0.78/logs"
#获取指定路径所有日志文件的总大小,单位M
size_all=`du -s -m $log_path | awk '{print $1}'`
#设置一个基准时间(此时此刻),从1970年1月1日00:00:00到目前经历的秒数
base_time=`date +"%s"`
#当指定路径下日志的总容量大于30M(我这里设置得比较小的原因是方便测试)时,删除最早创建的日志文件
if [ "$size_all" -gt "30" ];then
for i in `ls $log_path`;
do
date_suffix=`echo $i | cut -d '.' -f 2`
#判断截取出来的后缀字符串是否是out(因为catalina.out日志的存在)
if [ "$date_suffix" == "out" ];then
echo "i am catalina.out"
#这种情况的时候,需要跳出当前循环继续下一个循环
continue;
fi
echo $date_suffix
date_i=`date -d "$date_suffix" +"%s"`
echo "date_i="$date_i
#再通过循环获取最早日期的日志文件
#if [ "$date_i" -lt "$base_time" ];then
if [ `echo $date_i | awk -v bi=$base_time '{print($1<bi)?"0":"1"}'` -eq "0" ];then
base_time=$date_i
fi
done
earliest_date=`date -d @"$base_time" +"%F"`
echo "----------------------------分割线----------------------------------------"
echo "earliest_date="$earliest_date
#上面执行成功即循环结束之后,我们最后base_time变量的值一定是最早日期
#然后我们便可以删除掉我们获取到的最早日期的日志文件
if [ "$?" -eq "0" ];then
#先scp命令备份到专门存储日志的服务器上面,再进行删除(略)
/bin/rm -rf $log_path/*.$earliest_date.log
/bin/rm -rf $log_path/*.$earliest_date.txt
echo "ok"
fi
fi
定时任务
最后,将该脚本添加进定时任务:每天执行一次,每天晚上2点执行该脚本
00 2 * * * root /home/script/logpath_monitor.sh