随着服务器运行,业务日志不断增长,之前文章提供的日志器可对业务日志文件进行按天、大小、普通三种模式切分,本脚本是为解决服务器存储压力,对日切分日志文件进行定时清理与压缩存储,需要与crontab结合使用,脚本中提供了crontab脚本,可通过crontab -e进行添加,脚本采用系统自带的tar压缩为zip格式,压缩比率约为原文件1/4,日志文件路径需要对脚本文件FILE_DIR宏进行设置,FILE_DIR_BACK为备份文件路径,DEL_FILE_NUM为任务执行清理自当前时间内的文件,DEL_FILE_RET为保留的最近文件数,脚本运行参数如下:
test 用于测试,产生目标格式的日志文件及压缩文件
clear 用于清理文件
backup 用于备份文件
run 清理文件同时备份文件
crontab脚本如下:
* 10 * * 1 sh /data/web/dsp-gateway/crontab.sh run > /data/web/dsp-gateway/crontab.txt
#!/bin/bash
#@description 定时任务,以当前系统时间为基准,向前搜索DEL_FILE_NUM个文件,跳过最近DEL_FILE_RET个文件
#* 10 * * 1 sh /data/web/dsp-gateway/crontab.sh run > /data/web/dsp-gateway/crontab.txt
#@author chenbintao
#@data 2017-07-10 10:22 0.0.1 初稿
# 2017-07-10 11:31 0.0.2 调试通过
# 2017-07-10 14:41 0.0.3 增加保留文件压缩及历史压缩文件清理
# 2017-07-10 17:21 0.0.4 优化清理流程,先进行文件清理,再逐个压缩文件清理原始文件(tar -zcPf注意P参数的位置)
# 2017-07-10 18:09 0.0.5 增加运行环境检测,及增加备份目录,防止备份文件被flume收集
# 2017-07-10 18:20 0.0.6 增加提示及版本信息
# 2017-07-10 19:20 0.0.7 增加运行指令,支持清理与备份分离
# 2017-07-10 21:01 0.0.8 测试验证通过
# 2017-07-10 21:31 0.0.9 增加日志打印方法
#
#
VERSION=0.0.9 #版本
DEL_FILE_NUM=31 #删除文件数(总共的删除文件数)
DEL_FILE_RET=7 #保留文件间隔(当前时间多久不被删除)
FILE_DIR=/data/web/dsp-gateway/logs/ #文件目录
FILE_DIR_BACK=/data/web/dsp-gateway/logs/backup/ #文件目录
FILE_HEAD=(request response) #文件名称
FILE_TAIL=(log) #文件后缀
FILE_TAR=tar #压缩文件后缀
PAR_TEST=test #测试模式参数
PAR_CLEAR=clear #清理文件
PAR_BACKUP=backup #备份文件
PAR_RUN=run #正式运行
#
#
#
#方法集
function ifo(){
echo "=======================================文件清理/备份任务脚本 V${VERSION}($0)======================================="
echo "---0.模式选择(test:生成测试,run:正式运行(清理&备份),clear:清理文件,backup:备份文件)"
echo "---1.生成工具目录"
echo "---2.清理历史文件"
}
function clear(){
echo "2.清理非保留原始/压缩文件"
for((i=${DEL_FILE_RET}+1;i<=${DEL_FILE_NUM};i++));do
#计算时间
file_date=`date -d -${i}day +%F`
#遍历文件头列表
for j in ${FILE_HEAD[@]}; do
#遍历文件后缀列表
for k in ${FILE_TAIL[@]}; do
#组装文件名
file_name=${j}.${k}.${file_date}
#删除原始文件
cd ${FILE_DIR}
if [ ! -f "${FILE_DIR}${file_name}" ]; then
println '不存在文件:'${FILE_DIR}${file_name}
else
println '删除文件:'${FILE_DIR}${file_name}
rm -rf ${FILE_DIR}${file_name}
fi
#删除压缩文件
cd ${FILE_DIR_BACK}
tar_flie_name=${file_name}.${FILE_TAR}
if [ ! -f "${FILE_DIR_BACK}${tar_flie_name}" ]; then
println '不存在文件:'"${FILE_DIR_BACK}${tar_flie_name}"
else
println '删除文件:'"${FILE_DIR_BACK}${tar_flie_name}"
rm -rf "${FILE_DIR_BACK}${tar_flie_name}"
fi
done
done
done
}
function backup(){
echo "3.压缩保留文件并删除原始文件"
for((i=1;i<=${DEL_FILE_RET};i++)); do
#计算时间
file_date=`date -d -${i}day +%F`
#遍历文件头列表
for j in ${FILE_HEAD[@]}; do
#遍历文件后缀列表
for k in ${FILE_TAIL[@]}; do
#组装压缩文件名
file_name=${j}.${FILE_TAIL}.${file_date}
if [ ! -f "${FILE_DIR}${file_name}" ]; then
continue
fi
#生成压缩文件
tar_flie_name=${file_name}.${FILE_TAR}
cd ${FILE_DIR_BACK}
if [ ! -f "${FILE_DIR_BACK}${tar_flie_name}" ]; then
println '压缩文件:'"${FILE_DIR_BACK}${tar_flie_name}"
tar -zcPf "${FILE_DIR_BACK}${tar_flie_name}" ${FILE_DIR}${file_name}
else
println '已存在文件:'"${FILE_DIR_BACK}${tar_flie_name}"
fi
#清理原始文件
rm -rf ${FILE_DIR}${file_name}
println "删除文件:"${FILE_DIR}${file_name}
done
done
done
}
function test(){
echo "1.产生测试文件"
cd ${FILE_DIR}
for((i=1;i<=${DEL_FILE_NUM};i++)); do
#计算时间
file_date=`date -d -${i}day +%F`
#遍历文件头列表
for j in ${FILE_HEAD[@]}; do
#遍历文件后缀列表
for k in ${FILE_TAIL[@]}; do
#组装文件名
cd ${FILE_DIR}
file_name=${j}.${k}.${file_date}
#创建原始文件
touch ${FILE_DIR}${file_name}
#创建压缩文件
tar_flie_name=${file_name}.${FILE_TAR}
cd ${FILE_DIR_BACK}
tar -zcPf "${FILE_DIR_BACK}${tar_flie_name}" ${FILE_DIR}${file_name}
#
println "测试:创建文件 ${FILE_DIR}${file_name} ${FILE_DIR_BACK}${tar_flie_name}"
done
done
done
}
function println(){
echo `date '+%Y-%m-%d %H:%M:%S'`":"$*
}
#############################################################################################
#运行代码
echo "0.运行前准备"
cd ${FILE_DIR}
if [ ! -d "${FILE_DIR}" ]; then
echo "日志目录不存在,退出!"
exit
fi
if [ ! -d "${FILE_DIR_BACK}" ]; then
echo "备份目录不存在,创建!"
mkdir -p ${FILE_DIR_BACK}
fi
ifo
if [ $# -gt 0 ];then
if [ $1 == ${PAR_TEST} ];then
test
exit
elif [ $1 == ${PAR_RUN} ];then
clear
backup
exit
elif [ $1 == ${PAR_CLEAR} ];then
clear
exit
elif [ $1 == ${PAR_BACKUP} ];then
backup
exit
fi
echo "参数错误,退出!"
exit
fi
exit
有疑问加站长微信联系(非本文作者)