日志定时压缩清理shell脚本(日志文件后缀格式如xxxxx.log.2017-07-10)

来源:互联网 发布:淘宝主图视频手机拍摄 编辑:程序博客网 时间:2024/05/16 01:51

随着业务增长,日志量不断加大,清理日志成为定期的日常任务,本节所提供的shell脚本配合crontab可实现对日志的定时清理及压缩存储,内置参数配置及运行参数,能满足常用的日志清理场景需求。(日志文件的格式请参考本博客之前golang环境下的日志记录器-系列)


推荐的crontab指令:

* 10 * * 1 sh /data/web/xxxxx/crontab.sh run  > /data/web/xxxxx/crontab.txt
如上配置需将本脚本放置于/data/web/xxxxx目录下,具体使用时请自行调整

使用时需要配置:

DEL_FILE_NUM,删除当前日期前最远多久的日志文件

DEL_FILE_RET,保留当前日志前最近多久的日志文件

FILE_DIR,日志文件的存放路径

FILE_DIR_BACK,日志压缩存储的存放路径

FILE_HEAD,日志文件头,多类日志文件空格分割,如本节示例request,实际存储文件名形如request.log.2017-xx-xx

FILE_TAIL,日志文件后缀,多类空格分割,如本节示例log

运行参数:

test 将产生大小为0的示例文件,用于产生测试文件

clear 清理文件,可单独使用,运行仅清理文件,不进行压缩存储

backup 压缩存储文件,可单独使用,运行仅压缩文件,及清理历史的压缩文件

run 先清理需要删除的文件,并将保留文件压缩存储,可视为clear和backup指令的结合


#!/bin/bash#@description 定时任务,以当前系统时间为基准,向前搜索DEL_FILE_NUM个文件,跳过最近DEL_FILE_RET个文件#* 10 * * 1 sh /data/web/xxxxx/crontab.sh run  > /data/web/xxxxx/crontab.txt#@author chenbintao#@data2017-07-1010:220.0.1初稿#2017-07-1021:310.0.9增加日志打印方法#2017-07-1121:310.1.0修改压缩文件带路径的问题##VERSION=0.1.0#版本DEL_FILE_NUM=32#删除文件数(总共的删除文件数)DEL_FILE_RET=3#保留文件间隔(当前时间多久不被删除)FILE_DIR=/data/web/xxxxx/logs/#文件目录FILE_DIR_BACK=/data/web/xxxxx/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}" ]; thenprintln '不存在文件:'${FILE_DIR}${file_name}elseprintln '删除文件:'${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}" ]; thenprintln '不存在文件:'"${FILE_DIR_BACK}${tar_flie_name}"elseprintln '删除文件:'"${FILE_DIR_BACK}${tar_flie_name}"rm -rf "${FILE_DIR_BACK}${tar_flie_name}"fidonedonedone}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}" ]; thencontinuefi#生成压缩文件tar_flie_name=${file_name}.${FILE_TAR}cd ${FILE_DIR}if [ ! -f "${FILE_DIR_BACK}${tar_flie_name}" ]; thenprintln '压缩文件:'"${FILE_DIR_BACK}${tar_flie_name}"tar -zcPf "${FILE_DIR_BACK}${tar_flie_name}" ${file_name}elseprintln '已存在文件:'"${FILE_DIR_BACK}${tar_flie_name}"fi#清理原始文件rm -rf ${FILE_DIR}${file_name}println "删除文件:"${FILE_DIR}${file_name}donedonedone}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}tar -zcPf "${FILE_DIR_BACK}${tar_flie_name}" ${file_name}#println "测试:创建文件 ${FILE_DIR}${file_name} ${FILE_DIR_BACK}${tar_flie_name}"donedonedone}function println(){echo `date '+%Y-%m-%d %H:%M:%S'`":"$*}##############################################################################################运行代码echo "0.运行前准备"cd ${FILE_DIR}if [ ! -d "${FILE_DIR}" ]; thenecho "日志目录不存在,退出!"exitfiif [ ! -d "${FILE_DIR_BACK}" ]; thenecho "备份目录不存在,创建!"mkdir -p ${FILE_DIR_BACK}fiifoif [ $# -gt 0 ];thenif [ $1 == ${PAR_TEST} ];thentestexitelif [ $1 == ${PAR_RUN} ];thenclearbackupexitelif [ $1 == ${PAR_CLEAR} ];thenclearexitelif [ $1 == ${PAR_BACKUP} ];thenbackupexitfiecho "参数错误,退出!"exitfiexit


原创粉丝点击