代码
#delete log
function check_log_store() {
LOG_DIR=/opt/log
critical_capacity=70000 # 70M, configurable, max disk usage of log
# delete files generated 1 month ago when free disk space is less than 70M.
critical_time=$(date -d "1 month ago" +%Y%m%d)
#echo $critical_time
#delete early log
if [ $(du -s $LOG_DIR |awk '{print $1}') -ge $critical_capacity ]; then
#echo $(du -s $LOG_DIR |awk '{print $1}')
for i in $(ls $LOG_DIR); do
#echo $i
record=$(echo $i |awk -F "." '{count=1;do{print $count;count++;}while(count<=NF)}' |grep "20......-......" |cut -c 1-8 |awk '{if($0<'$critical_time'){print $0}}')
#echo $record
if [ -n "$record" ]; then
#echo $i
rm -f $LOG_DIR/$i
echo "delete old log $LOG_DIR/$i"
fi
done
#echo $(du -s $LOG_DIR |awk '{print $1}')
fi
#delete the earliest file for store
while [ $(du -s $LOG_DIR |awk '{print $1}') -ge $critical_capacity ]; do
#echo $(du -s $LOG_DIR |awk '{print $1}')
delete_file=$(ls -lt $LOG_DIR | grep ^- | awk '{print $9}' |tail -1)
if [ -n "$delete_file" ]; then
rm -f $LOG_DIR/$delete_file
echo "delete old log $LOG_DIR/$delete_file"
fi
done
#remove all old links
delete_link=$(ls -l $LOG_DIR | grep ^l | awk '{print $9}')
for i in ${delete_link}; do
rm -f $LOG_DIR/$i
echo "remove old link $LOG_DIR/$i"
done
}
思路
在容量到达界限之外后,先将一个月之前的日志删除,如果还未达到目标容量,再依次删除现存最老的日志文件,日志文件需要有特定的名称格式,需带有“年月日-时分秒”的对应时间戳,名称的其他部分不限,使用时间戳来作为日志文件名称,对查找定位bug位置也是有很大帮助的。一般情况下,程序对于日志文件的读写,都会在日志目录下放置一个指向需要读写文件的软链接,以达到程序解耦的目的。很多开源的日志文件工具,都会在程序启动时自动维护一个对应的软链接,如果自己写的话,也推荐使用软链接的方式来读写文件和应用程序,程序更新时,只需要删除旧的软链接,新建个同名的软链接指向新的程序或者日志文件,就可以不影响其他文件的情况下更新程序,对于这种软链接,在程序启动时,如果有实效的软链接,也会影响日志文件工具,创建新的链接,在这里,在每次启动时,删除掉旧的软链接,以防万一。
注
此脚本只维护单一一级文件目录下的文件的存储,如果是多级目录,请进行修改。