日志自动清理脚本

一、自定义脚本

 cat clean-expire-logs

#!/bin/bash

if [[ $# -lt 5 ]]; then
        echo "need target_dir log_level remain_count days_ago usage"
        exit -1
fi

target_dir=$1
log_level=$2
remain_count=$3
days_ago=$4
usage=$5

:
if ((${remain_count} <= 0)); then
        echo "remain_count need greater than 0!"
        exit -2
fi

if ((${days_ago} <= 0)); then
        echo "days_ago need greater than 0!"
        exit -2
fi

if ((${usage} <= 0)); then
        echo "usage need greater than 0!"
        exit -2
fi

# judge if target_dir exists
if ! [[ -d ${target_dir} ]]; then
        echo "dir $target_dir not exists!"
        exit -3
fi

# filter files under target_dir
to_sort_files=()
todo_count=0

exclude_files=()
exclude_count=0

target_files=$(ls ${target_dir}|awk '{print i$0}' i=${target_dir}'/')

condition="^${target_dir}/kubelet\.[^\.]+\.[^\.]+\.log\.${log_level}\.[^\.]+\.[^\.]+$"
for f in ${target_files[@]}
do
        if ! [[ -f ${f} ]]; then
                continue
        elif [[ -L ${f} ]]; then
                link_file=`readlink ${f}`
                if [[ "${link_file}" =~ ^[^/]+ ]]; then
                        link_file=${target_dir}'/'${link_file}
                fi
                if [[ "${link_file}" =~ ${condition} ]]; then
                        exclude_files[exclude_count]=${link_file}
                        ((exclude_count+=1))
                fi
                continue
        elif ! [[ "${f}" =~ ${condition} ]]; then
                continue
        fi

        to_sort_files[todo_count]=${f}
        ((todo_count+=1))
done

# sort
sorted_files=$(for f in ${to_sort_files[@]}; do echo $f; done | sort -t "." -k 6 -r)
to_del_files=()
todel_count=0
filtered_count=0
date_days_ago=`date +"%Y%m%d" -d "${days_ago} days ago"`
current_usage=`df -h ${target_dir} |awk '{print $5}'|sed -n '2s/%//p'`

if [[ ${current_usage} -ge ${usage} ]];then
   echo "Disk usage is greater than ${usage}%, exec number keep strategy"
   for f in ${sorted_files[@]}
   do
        if [[ "${exclude_files[@]}" = *"${f}"* ]];then
		    continue
	    elif [[ ${filtered_count} -lt ${remain_count} ]];then
		    ((filtered_count+=1))
            continue
	    fi
		to_del_files[todel_count]=${f}
		((todel_count+=1))
    done
	
else
    echo "Disk usage is greater than ${usage}%, exec days keep strategy"
    for f in ${sorted_files[@]}
	do
	    logfile_date=`echo ${f} |awk -F . '{print $6}'|awk -F- '{print $1}'`
        
		if [[ "${exclude_files[@]}" = *"${f}"* ]]; then
		    continue
	    fi
		
		if [[ ${logfile_date} -lt ${date_days_ago} ]];then
		    to_del_files[todel_count]=${f}
			((todel_count+=1))
	    fi
	done
fi


# print and clean
for f in ${to_del_files[@]}
do
        ionice -c2 -n7 rm -f "${f}"
		echo "del------------>${f}"
done

二、定时任务

cat /etc/cron.d/clean-log

# 每日凌晨执行定时清理任务
00 00 * * * root /bin/sh /etc/kubernetes/clean-expire-logs.sh /home/admin/kubernetes/logs ERROR 5 180 80 >/dev/null 2>&1 0>&1
00 00 * * * root /bin/sh /etc/kubernetes/clean-expire-logs.sh /home/admin/kubernetes/logs INFO 20 180 80 >/dev/null 2>&1 0>&1
00 00 * * * root /bin/sh /etc/kubernetes/clean-expire-logs.sh /home/admin/kubernetes/logs WARNING 5 180 80 >/dev/null 2>&1 0>&1
00 00 * * * root /bin/sh /etc/kubernetes/clean-expire-logs.sh /home/admin/kubernetes/logs FATAL 5 180 80 >/dev/null 2>&1 0>&1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN-FuWei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值