服务器系统运行一段时间后就会自动崩溃。究其原因发现,是系统存放日志的文件夹已满,导致日志文件夹所在系统分区无法正常工作,于是就有了这个日志清理脚本。

日志产生目录 在系统日志产生时,存放在/var/log/下。

日记备份目录 将日志备份到/mnt/storage/log/中

备份目录最大容量 备份目录最大容量,如500mb。在超过此值时,程序将不断的将最旧的日志备份删除。

白名单 系统重要日志白名单。有些日志不太重要我门不需要备份。

日志文件名格式 新日志以.log结尾。将白名单中重要日志加上时间戳,如mail.log.20171018153059

脚本行为 脚本每隔10s扫描/var/log下新日志的大小。如果发现有大小超过5mb的日志,如果是白名单中的日志,则会将其备份到备份目录中,原日志删除;如果发现其不再日志备份目录中,则直接删除。然后,检查是否超过了备份目录中的最大容量,如果超过,则将最老的日志备份删除。

#!/bin/bash
#
#最大日志容量
alarmrate=500
#the max size file can reach
file_max_size=5
#日志生成目录
log_ram_dir=/var/log
#日志备份目录
working_dir=/mnt/storage/log
#定时备份间隔5s
SLEEPTIME=5
#给文件名打时间戳
filenameConvert()
{
timestamp=$(date +%Y%m%d%H%M%S)
timestamp=`echo $timestamp`
RETVAL=$1.$timestamp
}
#搜索最旧的日志文件
searchdir()
{
oldestlog=`ls -rt | head -n 1 | awk '{print $1}'`
}
#删除工作目录下的旧日志
clear_old_log_under_working_dir()
{
cd $working_dir
while true;
do
logsize=`du -ms $working_dir | awk '{print $1}'`
if [ $logsize -gt $alarmrate ];
then
searchdir
rm -rf $oldestlog
else
break;
fi 
done
}
#this is main process of our log backup activity.
#日志备份函数,主要备份白名单中的日志文件。
backuplog_process()
{
cd $log_ram_dir
for i in * ;
do
file_size=`du -m $i | awk '{print $1}'`
case $i in
access.log | error.log | apcupsd.events | evms-engine.log| \
messages | kern.log | lpr.log | mail.err | \
mail.info | main.log | mail.warn | news | \
rsyncd.log | user.log | dmesg | dmesg.0 | dmesg.new)
if [ ! -d $working_dir ];then
mkdir -p $working_dir
fi
if [ file_size -gz file_max_size ];then
filenameConvert $i
cp $log_ram_dir/$i $working_dir/$RETVAL
echo "" > $log_ram_dir/$i
clear_old_log_under_working_dir
fi
;;
*)
if [ file_size -gz file_max_size ];then
echo "" > $log_ram_dir/$i
fi
esac
done
}

while true ;
do
backuplog_process
sleep $SLEEPTIME
done

[root@Centos shell]# chmod +x cleanLog.sh 
[root@Centos shell]# crontab -e
*/1 * * * * /opt/bin/cleanLog.sh