Shell脚本:完成日志老化,将保存一周的日志打包转移到新目录下,并保存一月后清除。

一、功能介绍

将某一目录下的所有日志进行老化处理,这些日志是来自于其他容器的外挂日志,由于各个容器内的日志安排不同,所以结构不统一,具体如下举例:

1.所有容器下的日志会外挂到/home/log下,我们处理这个目录下的日志就可以;

2./home/log下的结构按外挂容器名和具体日志有如下结构,只是举例,列举部分容器的外挂:

-home-log-Container1-catalog1-catalog2.1-catalog3-catalog4-catalog5-cataline.out

                |                                |                                                              | - cataline20181126.out

                |                                |                                                              | -cataline20181127.out

                |                                |                                                              | -someimporttemp.txt

                |                                |                                                              | -someimport.log

                |                                |                                                              | -import.tar

                |                                | -someimporttemp.txt

                |                                | -someimport.log

                |                                | -catalog2.2-catalog3- someimporttemp.txt

                |                                                                   | -someimport.log

                |                                                                   | -import.tar

                | -Container2-catalog1-catalog2.1-catalog3-catalog4-someimporttemp.txt

                |                                                                                   | -someimport.log

                |                                                                                   | - import.tar

                |  -后面的容器日志类似于上面

现在要求日志老化,具体要求如下:

1.将以上具体某个日志下的日志已保留了七天的统一打包到一个目录下,该目录的名称和原来的目录名称基本对应,以保证在看其备份日志时,可以方便查找;

2.上面打包以后采用直接move操作来转移到新目录下;

3.在新的统一目录下,要求所有的tar包都只保留一个月,一个月后自动清除。

二、部分注意指令

1.find 目录 -maxdepth 1 -ctime +7 -type f    ----------查找某一目录下以保存了一周的日志文件;

2.if [[ " "x != ${NOT_INCLUDE}x ]] && [[ -n "`find ${targetdir} -maxdepth 1 -type f | grep -v 'gz$'`" ]]

当判断条件居多且内含一些繁琐操作的命令时,将原有的单[ ],改为[[ ]],可有效避免Linux的兼容性问题;

3.tar指令中添加--warning=no-file-changed来解决常见的报错处理;

4.tar指令中--exclude的使用,将常见使用的“--exclude 文件”改为“--exclude=文件”,有效避免Linux的兼容性问题;

5.tar --zpcP中注意p和P的区别:

   -p :保留备份数据的原本权限和属性,常用于备份重要的配置文件;

   -P :保留绝对路径,即允许备份数据中含有根目录存在之意。 

三、具体代码

#!/bin/bash
#Program:
#History: 2018.11.20 zyf

#Common constant
NOWTIME=`date +"%Y%m%d%H%M%S"`
LOG_PATH=/home/log
LOG_BACKUP_PATH=/home/backuplog
LOG_TEMPFILE_PATH=/home/logtemp
LOG_TEMPFILE1=${LOG_TEMPFILE_PATH}/temp.dat
LOG_TEMPFILE2=${LOG_TEMPFILE_PATH}/clearlog-${NOWTIME}.dat
LOG_TEMPFILE3=${LOG_TEMPFILE_PATH}/firsttarfiles.dat

#print timestamp
getTimeStamp()
{
    echo `date +"%Y-%m-%d %H:%M:%S"` 
}

mkdir_clearlog()
{
    if [ ! -f "${LOG_TEMPFILE2}" ]; then
        log "mkdir_clearlog touch ${LOG_TEMPFILE2}..."
        touch ${LOG_TEMPFILE2}
    fi
}

#print log for analyzing
log()
{
    echo " $1"
    echo "`getTimeStamp` : $1" >> ${LOG_TEMPFILE2}
}

errlog()
{
  echo "[ERROR:] $1"
  echo "`getTimeStamp` : [ERROR:] $1" >> ${LOG_TEMPFILE2}
}

abnormalexit()
{   

  errlog "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
  errlog "@@@@@@@@        !!! FAILED !!!       @@@@@@@"
  errlog "@@@@@    CLEARLOGS OPERATE FAILED!!   @@@@@@"
  errlog "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
      
  exit 1
}

function cmdlog()
{
   cmd=$1
   log "$cmd"
   `$cmd`
   if [ $? -ne 0 ]
   then
      errlog "$cmd"
      abnormalexit
   fi
}

#scan all subdirectories of the current directory 
#and make the corresponding directories in the specified directory,
#then mv required files in sourcedir to targetdir and make new tar
mkdir_and_deallog()
{       
    if [ ! -d ${LOG_TEMPFILE_PATH} ]; then
        mkdir -p ${LOG_TEMPFILE_PATH}
    elif [ ! -f "${LOG_TEMPFILE1}" ]; then
        log "mkdir_and_deallog() touch LOG_TEMPFILE1..."
        touch ${LOG_TEMPFILE1}
    else
        cat /dev/null > ${LOG_TEMPFILE1}
    fi

    find ${LOG_PATH} -maxdepth 15 -type d >> ${LOG_TEMPFILE1}
    for line in `cat ${LOG_TEMPFILE1}`
    do
        CURRENT_DIR=`echo ${line} | cut -d '/' -f 4-`
        if [ -n "${CURRENT_DIR}" ]; then
            CORRESPOND_DIR=${LOG_BACKUP_PATH}/${CURRENT_DIR}
            if [ ! -d ${CORRESPOND_DIR} ]; then
                log "mkdir_and_deallog mkdir -p ${CORRESPOND_DIR}"
                mkdir -p ${CORRESPOND_DIR}
            fi
            deal_required_logs "${CORRESPOND_DIR}" "${LOG_PATH}/${CURRENT_DIR}"
        fi        
    done
}

#mv required files in sourcedir to targetdir and make new tar
deal_required_logs()
{
    targetdir=$1
    sourcedir=$2
    
    #view sourcedir log files and mv
    log "=========================================================="
    log "deal_required_logs start, and now executing in ${sourcedir}..."
    log "=========================================================="
    for file in `find ${sourcedir} -maxdepth 1 -ctime +7 -type f`
    do
        log "deal_required_logs ${file} in ${sourcedir} created over 7 days"
        if [ -n "${file}" ] && [ ! -n "`lsof ${file}`" ]; then
            cmdlog "cp ${file} ${targetdir}"            
        fi
    done

    #tar targetdir
    log "=========================================================="
    log "cp-execute end, and now executing in ${targetdir}..."
    log "=========================================================="
    NOT_INCLUDE=" "
    for file in `find ${targetdir} -maxdepth 1 -type f | grep 'gz$'`
    do
        if [ -n "${file}" ]; then   
            NOT_INCLUDE=${NOT_INCLUDE}"  --exclude="${file}" "        
        fi
    done
    
    log "deal_required_logs() set files that not-including, NOT_INCLUDE=${NOT_INCLUDE}......"
    if [[ " "x == ${NOT_INCLUDE}x ]]; then
		log "start firsttarfile_targetdir : firsttarfile_targetdir ${targetdir}"
		firsttarfile_targetdir ${targetdir}
	elif [[ " "x != ${NOT_INCLUDE}x ]] && [[ -n "`find ${targetdir} -maxdepth 1 -type f | grep -v 'gz$'`" ]]; then
		log "tar --zpcP -f ${targetdir}/${NOWTIME}.tar.gz ${NOT_INCLUDE}  ${targetdir}"
		tar --warning=no-file-changed -zpcP -f ${targetdir}/${NOWTIME}.tar.gz ${NOT_INCLUDE} ${targetdir}
	fi	    
}

firsttarfile_targetdir()
{
	targetdir=$1
	if [ ! -f "${LOG_TEMPFILE3}" ]; then
		log "firsttarfile_targetdir() touch LOG_TEMPFILE3..."
		touch ${LOG_TEMPFILE3}
	fi
	
	find ${targetdir} -maxdepth 1 -type f >> ${LOG_TEMPFILE3}
	FIRST_TAR_FILES=" "
	for line in `cat ${LOG_TEMPFILE3}`
	do
		if [[ " "x != ${line}x ]]; then
			FIRST_TAR_FILES=${FIRST_TAR_FILES}" "${line}	
        fi			
	done
	
	log "firsttarfile_targetdir : FIRST_TAR_FILES=${FIRST_TAR_FILES}"
	if [[ " "x != ${FIRST_TAR_FILES}x ]]; then
		log "tar --warning=no-file-changed -zpcP -f ${targetdir}/${NOWTIME}0.tar.gz ${FIRST_TAR_FILES}"
		tar --warning=no-file-changed -zpcP -f ${targetdir}/${NOWTIME}0.tar.gz ${FIRST_TAR_FILES}	
    fi	

    rm 	${LOG_TEMPFILE3}
}

clear_overtime_files()
{
    log "clear_overtime_files rm tar.gz that save more than 30 days......"
    find ${LOG_BACKUP_PATH} -mtime +30 -name "*.tar.gz" -exec rm -rf {} \;
    
    log "clear_overtime_files rm temp files that save more than 2 days......"
    find ${LOG_TEMPFILE_PATH} -mtime +2 -name "*.log" -exec rm -rf {} \;
    
    log "clear_overtime_files rm extra files in /home/backuplog......"
    find /home/backuplog -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {} 
}

###############main##############
cd ${LOG_PATH}
mkdir_clearlog

log "clearlogs.sh start..."
mkdir_and_deallog
clear_overtime_files
log "clearlogs.sh end..."
log "[~CLEARLOGS OPERATE SUCCESS~]" 

 

相关推荐
©️2020 CSDN 皮肤主题: 点我我会动 设计师:白松林 返回首页