一、自定义脚本
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