shell脚本:检查ftp日志存储服务器上的日志是否正常上传

author author     2022-07-31     556

关键词:

脚本:check_log.sh

主要功能:用于检查日志文件是否上传到ftp服务器,若未上传的,则发邮件报警

-------------------

#!/bin/bash
#Auto check log files and notice by email
#By colin
#Revision on 2015-11-03
#
#Useage: ./check_log.sh /home/upload/ 
# 10 * * * * /root/check_log.sh
#
################################

RUN_LOG=‘/var/log/check_log_run_stats.log‘
[ ! -f ${RUN_LOG} ] && touch ${RUN_LOG}

echoGoodLog(){
    echo -e "33[32m`date +%F" "%T":"%N` $*33[0m" >> ${RUN_LOG}
}

echoBadLog(){
    echo -e "33[31m`date +%F" "%T":"%N` $*33[0m" >> ${RUN_LOG}
}

echoGoodLog "Now, Script: `basename $0` run."
#########################

EMAIL=(
    [email protected]邮件地址.cn
)

#需要检查的目录
DIR_LIST=(
    /home/upload/aclog
    /home/upload/eglog
    /home/upload/nginxlog
    /home/upload/mysql
    /home/upload/gonet
)

#需要检测的目录应包含的关键词
LOGFILE_TYPE=(
    aclog
    eglog
    nginxlog
    gonet
    mysql
)

#需要检查的省份
NEED_TO_DONE=(
    sd
    hlj
)

CHECK_INTERVAL=3600
CHECK_INTERVAL_1_hour=1
CHECK_INTERVAL_24_hour=24

#24小时检测一次的清单
DIR_LIST_24=(
    mysql
    gonet
)

#在指定时间段内不检查的目录
EXCLUDE_DIR=(
    gonet
)

TEMP_DIR_FILES=‘/tmp/temp_check_log_dir_list.txt‘
TEMP_EMAIL_FILES=‘/tmp/temp_email_files.txt‘
[ ! -f ${TEMP_EMAIL_FILES} ] && touch ${TEMP_EMAIL_FILES}

NOW_TIME=`date +%F" "%T`
SYS_TIME=`date -d "${NOW_TIME}" +%s`
HOURTIME=`echo $(date +%k) |sed ‘s/ //g‘`

toDoneGrep(){
    DIR=$1
    LOGFILE_TYPE_TMP=`echo ${LOGFILE_TYPE[@]} |sed "s/ /|/g"`
    CASECONDITION=`echo ${DIR} |grep -Eo "${LOGFILE_TYPE_TMP}"|tail -1`
    case ${CASECONDITION} in
        aclog)GREPCONDITION=‘[a-z]{5}[0-9]{4}(-[0-9]{2}){3}‘;;
        eglog)GREPCONDITION=‘[a-z]{7}[0-9]{4}(-[0-9]{2}){3}‘;;
        nginxlog)GREPCONDITION=‘[0-9]{4}(-[0-9]{2}){3}.[a-z]+[0-9]*.nginxlog.tar.gz‘;;
        gonet)GREPCONDITION=‘gonet[0-9]{4}(-[0-9]{2}){2}.tar.gz‘;;
        mysql)GREPCONDITION=‘[0-9]{4}(-[0-9]{2}){2}.rht_[a-zA-Z]+.tar.gz‘;;
    esac
}

addToEmail(){
    DIR=$1
    [ ! -f ${TEMP_EMAIL_FILES} ] && touch ${TEMP_EMAIL_FILES}   
    [ $4 -eq 1 ] && {
        if [ $2 -ge $3 ];then
            cat >>${TEMP_EMAIL_FILES} <<EOF
DIR: $1 more than ${INTERVAL_HOUR} hour not upload a new log file, Please check!
EOF
            echoBadLog "$x time, The ${DIR} over $2 hour did not create a new log file ..."  
        elif [ $5 -lt $6 ];then
            cat >>${TEMP_EMAIL_FILES} <<EOF
DIR: $1 loss some new log files, Please check!
EOF
            echoBadLog "DIR: ${DIR} loss some new log files, Please check!"  
        fi
    } 
}

checkLog(){
    DIR=$1
    LAST_FILE_TIME=`ls --full-time -lt |head -2|sed -n 2p |awk ‘{print $6,$7}‘|awk -F. ‘{print $1}‘`
    FILE_TIME=`date -d "${LAST_FILE_TIME}" +%s`
    INTERVAL=`expr ${SYS_TIME} - ${FILE_TIME}`
    INTERVAL_HOUR=`expr ${INTERVAL} / ${CHECK_INTERVAL}`    
    TEMP_DIR_LIST_24=`echo ${DIR_LIST_24[@]} |sed "s/ /|/g"`
    TMP_I=`echo ${DIR} |grep -E "${TEMP_DIR_LIST_24}" |wc -l`
    FILE_NUM=`ls -lh ${DIR} |grep "^-"|wc -l`
    [ ${FILE_NUM} -gt 0 ] && [ ${INTERVAL_HOUR} -le 48 ] && {
        cd ${DIR} && {
            if [ ${TMP_I} -eq 0 ];then
                toDoneGrep ${DIR} 
                FILE_NUM2=`find . -maxdepth 1 -type f -mmin -120| grep -Eo "${GREPCONDITION}" |wc -l`
                FILE_NUM3=`find . -maxdepth 1 -type f -mmin -60| grep -Eo "${GREPCONDITION}" |wc -l`
                FILE_NUM_120=`expr ${FILE_NUM2} - ${FILE_NUM3}`
                [ ${FILE_NUM2} -eq 0 ] && FILE_NUM2=1
                FILEEXIST_NUM=`expr ${FILE_NUM2} % 2`
                addToEmail ${DIR} ${INTERVAL_HOUR} ${CHECK_INTERVAL_1_hour} ${FILEEXIST_NUM} ${FILE_NUM3} ${FILE_NUM_120}
            else
                toDoneGrep ${DIR} 
                FILE_NUM2=`find . -maxdepth 1 -type f -mtime -2| grep -Eo "${GREPCONDITION}" |wc -l`
                FILE_NUM3=`find . -maxdepth 1 -type f -mtime -1| grep -Eo "${GREPCONDITION}" |wc -l`
                FILE_NUM_120=`expr ${FILE_NUM2} - ${FILE_NUM3}`
                [ ${FILE_NUM2} -eq 0 ] && FILE_NUM2=1
                FILEEXIST_NUM=`expr ${FILE_NUM2} % 2`
                addToEmail ${DIR} ${INTERVAL_HOUR} ${CHECK_INTERVAL_24_hour} ${FILEEXIST_NUM} ${FILE_NUM3} ${FILE_NUM_120}
            fi
        }
    }
}

checkDir(){
    TEMPDIR=`echo ${NEED_TO_DONE[@]} |sed "s# #/|/#g"`
    TEMPDIRNUM=`echo "${DIR}" |grep -vE "[A-Z]"|grep -vE "[0-9]{4}(.[0-9]{2}){2}"|grep -vE "/[0-9]+"|grep -E "/${TEMPDIR}/" |wc -l`
    [ "${TEMPDIRNUM}" -eq 1 ] && {
        DIR=$1
        LAST_LOG_TIME=`tail -500 ${RUN_LOG} |grep ${DIR} |tail -1|grep -Eo "[0-9]{4}(-[0-9]{2}){2} ([0-9]{2}:){2}[0-9]{2}"`
        [ -z "${LAST_LOG_TIME}" ] && LAST_LOG_TIME=`date +%F" "%T` 
        log_time=`date -d "${LAST_LOG_TIME}" +%s`
        LOG_INTERVAL=`expr ${SYS_TIME} - ${log_time}`
        x=`tail -500 ${RUN_LOG} |grep ${DIR}|grep "time" |tail -1|awk ‘{print $3}‘`
        [ -z "$x" ] && x=0
        cd ${DIR}
        if [ "${LOG_INTERVAL}" -ge "${CHECK_INTERVAL}" ];then
            [ "$x" -eq 3 ] && x=1 || i=`expr $x + 1`
            checkLog ${DIR}
        else
            [ "$x" -lt 3 ] && {
                [ "$x" -eq 3 ] && x=1 || i=`expr $x + 1`;
                checkLog ${DIR}
            }
        fi
    }
}

excludeCheckDir(){
    DIR=$1
    EXCLUDECONDITION=`echo "${DIR}" |awk -F/ ‘{print $NF}‘`
    TEMPNUM=`echo "${EXCLUDE_DIR[@]}" |grep -wo "${EXCLUDECONDITION}" |wc -l`
    if [ "${TEMPNUM}" -ne 1 ];then
        checkDir ${DIR}
    #elif [ "${HOURTIME}" -ge 8 -a "${HOURTIME}" -le 22 ];then
    elif [ "${HOURTIME}" -ge 8 -a "${HOURTIME}" -le 8 ];then
        checkDir ${DIR}
    fi
}

loopDir(){
    for i in $1/*
    do
        if [ -d $i ];then
            TEMPDIR=`echo ${NEED_TO_DONE[@]} |sed "s# #/|/#g"`
            TEMPDIRNUM=`echo "$i" |grep -vE "[A-Z]"|grep -vE "[0-9]{4}(.[0-9]{2}){2}"|grep -E "/${TEMPDIR}/" |wc -l`
            [ ${TEMPDIRNUM} -eq 1 ] && echo "$i" >>${TEMP_DIR_FILES}
            loopDir $i
        fi
    done
}

if [ -z "$*" ];then
    for i in ${DIR_LIST[@]}
    do
        echo `echo "$i" |sed ‘s#/$##g‘` >>${TEMP_DIR_FILES}
        loopDir `echo "$i" |sed ‘s#/$##g‘`
    done
else
    for i in $*
    do
        [ -d $i ] && {
            echo `echo "$i" |sed ‘s#/$##g‘` >>${TEMP_DIR_FILES}
            loopDir `echo "$i" |sed ‘s#/$##g‘` 
            } || echoBadLog "The $i is‘t a directory, Please check the arguments ..."
    done
fi

[ -f ${TEMP_EMAIL_FILES} ] && {
    while read line
    do
        excludeCheckDir $line
    done < ${TEMP_DIR_FILES}
}

[ `cat ${TEMP_EMAIL_FILES}|wc -l` -eq 0 ] || { 
    for i in ${EMAIL[@]}
    do
        dos2unix -k ${TEMP_EMAIL_FILES} 
        mail -s "THE LOG Is NOT EXISTS" ${i} < ${TEMP_EMAIL_FILES}
        echoGoodLog "Send email to ${i}, Please check ..."
    done
}

[ -f ${TEMP_EMAIL_FILES} ] && rm -rf ${TEMP_EMAIL_FILES}

[ -f ${TEMP_DIR_FILES} ] && {
    cp -a ${TEMP_DIR_FILES} /home/upload/uploadDirList.txt
    rm -rf ${TEMP_DIR_FILES} 
}

TEMP_WC=`cat ${RUN_LOG} |wc -l`
if [ "${TEMP_WC}" -gt 10000 ];then
    sed -i "1,5000d" ${RUN_LOG}
    echoGoodLog "Clean up the ${RUN_LOG}..."
    echoGoodLog "Script: `basename $0` run done."
else
    echoGoodLog "Script: `basename $0` run done."
    exit
fi

-------------------

脚本:set_for_check_log.sh

脚本功能:用于部署check_log脚本的运行环境

-------------------

#! /bin/sh
#auto set the system environment for the check_log.sh
#by colin on 2015-06-25

echo "33[32mNow, To set the system environment for the check_log.sh33[0m"
#install command mailx and dos2unix
apt-get -y install heirloom-mailx dos2unix
#set /etc/nail.rc, use command mailx to send mail
sed -i "/sendcharsets/s/=.*/=GB2312/g" /etc/nail.rc
cat >> /etc/nail.rc <<EOF
set from=用户名@126.com  smtp=smtp.126.com
set smtp-auth-user=用户名  smtp-auth-password=密码
set smtp-auth=login
EOF

scripts=‘/root/check_log/check_log.sh‘
if [ -f ${scripts} ];then
    chmod +x ${scripts};
    echo "* * * * * /bin/sh ${scripts} >>/var/log/check_log_run_stats.log" >>/var/spool/cron/crontabs/root
else
    echo "33[31mPlease check if there is the check_log.sh in the root directory.33[0m"
fi
echo "33[32mDone.33[0m"


本文出自 “上山路十八弯” 博客,转载请与作者联系!

shell脚本:日志切割与上传

脚本说明:日志切割与上传类脚本的功能:脚本自身的运行日志记录与清理、日志切割与打包、ftp上传、传送失败自动重传、断电自动补传、清理超期旧打包等--------------------#!/bin/bash# Cut and upload aclog log# b... 查看详情

shell脚本怎么生成运行日志

麻烦问一下,怎样才能在运行一个shell脚本的同时生成这个脚本的运行日志,且日志名称为脚本运行当天的日期,并且日志内也记录时间,例如几点几分出了问题、脚本的运行情况。求大神传授!!参考技术A自己写的脚本调用的... 查看详情

sql用于检查sqlserver上的文件大小和日志使用情况的sql脚本(代码片段)

查看详情

springboot项目部署到linux服务器

参考技术A1.首先将SpringBoot项目打包成JAR包,然后通过FTP工具上传到Linux,执行如下命令:该命令执行后,启动jar,一旦shell窗口关闭后,JAR就停止运行了.若需要项目在后台一直运行,需要通过如下命令启动JAR:上述2和1的含义如... 查看详情

linux学习总结(76)——shell脚本日志技巧(代码片段)

常见日志打印方式编写shell脚本时,最简单的日志打印是使用echo输出,比如:下面是打印一个测试程序的日志[root@VM-0-2-centos~]#echo"thisisalogtest..."thisisalogtest...上面的方式使用起来非常简单,编写效率也很高,对于一些功能简单,代... 查看详情

nginx--基于crond定时服务+shell脚本实现nginx日志自动清理及备份(代码片段)

...l-USR1+nginx的PID进程文件来实现本文主要介绍自定义shell脚本+crond定时任务实现。二、shell脚本2.1、脚本实现思路定义日志要保存的天数SAVE_DAYS=7重命名当天日志mv* 查看详情

http500内部服务器错误怎么解决。

参考技术A解决办法如下:1.检查服务器日志检查错误日志中是否存在http500内部服务器错误,如果您的主机没有日志记录工具,您还可将define('wp-DEBUG',true);添加到wp-config.php文件以启用日志记录。2.增加Apache中的PHP内存限... 查看详情

ftp脚本

...工作中自己使用的,下次分享同一局域网內自动从Linuxftp服务器下载文件和Windowsftp自动获取文件。 查看详情

如何用批处理脚本检查日志文件并发邮件

...错误邮件,比如20101026.log这样的文件,邮件内网有exchange服务器,不能发邮件写入一个文本也行,高手指教,谢谢,别的脚本或工具也可以。参考技术A我们写的脚本不一定在你的机器上使用是正常的,这里面涉及到操作系统,系... 查看详情

十万火高分急求一个shell脚本,下午2点就要要了

...time+1|xargs-irm-rfumount/tmp/netdiskrm-rf/tmp/netdisk你测试一下这个脚本,定期执行这个脚本就行了全部手写的,期待采纳追问你好,我现在脚本差不多写出来了。但是不是很懂find,用的最笨的方法,根据文件名来的。但是现在有一个问... 查看详情

如何将日志服务的数据秒级同步到表格存储

...像中,新增了loghub-shipper的镜像,使用该镜像,可以订阅日志服务中的日志库,以秒级的延时将日志数据从日志服务中读出并转换成结构化数据存储在表格存储中,以满足实时在线服务的精确查询需求。什么是日志服务?日志服... 查看详情

linux学习总结(76)——shell脚本日志技巧(代码片段)

常见日志打印方式编写shell脚本时,最简单的日志打印是使用echo输出,比如:下面是打印一个测试程序的日志[root@VM-0-2-centos~]#echo"thisisalogtest..."thisisalogtest...上面的方式使用起来非常简单,编写效率也很高,对于一些功能简单,代... 查看详情

powershell脚本到尾部日志文件的多个远程服务器(代码片段)

...个很难搞清楚如何同时保证我能“尾巴”的日志全部5台服务器上的条目,并返回“确定”;终止,只有当所有5台服务器上生成的日志条目,而不只是让我们说他们的4工作。下面是它是什么意思做:启动服务,“尾巴”的日志文... 查看详情

定时删除日志

...的静态页面文件备份盘满了。。怎么办?每次都是登录到服务器,切换到对应目录删除文件。一次两次还好,那要是经常这样谁受得了啊。那我们接下来就编写一个shell脚本让服务器定时去执行,嗯,就是一行linux语句,对,就... 查看详情

shell定期删除日志脚本

你好,我对shell脚本不是太熟,现在遇到个需求,要将目录下的隔日日志文件删除,用一个脚本定期执行,怎么去做这个,如目录为/tmp/logs/,下面的日志文件名称为comet.root.....20140721(日期格式).log.版本号,求解,脚本要先处理知... 查看详情

wdcp管理系统在哪打开并查看ftp日志

...日志,请问在哪弄?参考技术A你说的这个是想要知道你服务器上的某个用户的操作日志保持到某个指定的FTP里面,我不知道怎么做,但是你不是可以到WDCP后台查看这些用户的操作日志记录吗?我这边是可以看到的!题外相似问... 查看详情

shell执行将脚本里的变量打印到指定日志文件

...行日志或者报错信息,才能定位问题。通过shell调用有些脚本的话,日志信息会打印在shell里。不过也有用户在shell里调用正常,但是到crontab调用的时候就出错并且没日志了。针对这种情况,可以在crontab里把任务执行的输出记录... 查看详情

shell脚本删除30天之前日志

...示文件xargs是获取find查找的结果在通过rm命令删除2、部署服务器3、设置crontab定时任务  打开定时任务配置文件:crontab-e  定时调用test.sh:*****/home/test.sh    保存退出:按键ESC,输入:wq第一个*   ... 查看详情