Linux定时对日志批量打包Shell脚本

时间:2024-03-30 11:01:04

一、需求背景

     因此次项目的生产环境中部署了多套系统,每天会产生大量的日志(数百GB的量),侵占了服务器宝贵的存储资源空间。为了有效缓解服务器存储压力,考虑通过Linux的Shell脚本结合crontab定时每周一对上周7天的日志打包压缩,并删除原被打包的日志文件,以腾出更多可利用的存储资源空间。

        对于初次接触Shell脚本的同学,建议先花几个小时时间学习一下Shell。附Shell教程链接如下:   

        http://www.runoob.com/linux/linux-shell-process-control.html

二、Shell脚本

进入Linux终端,键入vim timePackLogs.sh(脚本名称)创建脚本并编辑如下脚本代码: 

#!/bin/bash

#author:wangzx

#date:20180821

#department:xxxx

#email:[email protected]

#if you have any questions, please contact the email!

echo `date '+%Y-%m-%d %H:%M:%S'`" 打包程序执行开始!";

echo "开始打包从7天前截止昨天的日志(如本周日打包上周日到上周六的日志)!";

#筛选打包日志文件的起始日期

sevenDaysAgoDate=`date -d "7 days ago" +%Y-%m-%d`

#筛选打包日志文件的截止日期(此处为获取当前日期)

currentDate=`date +%Y-%m-%d`

#起始日期时间戳(作为日期范围对比使用)

sevenTimeStamp=`date -d "$sevenDaysAgoDate" +%s`

#截至日期时间戳

currentTimeStamp=`date -d "$currentDate" +%s`

index=0

#日志读取路径

filePath="/home/weblogic/logs1"

#获取该路径下所有日志文件

fileList=`ls $filePath -1 -c`

#遍历所有日志文件

for fileName in $fileList

do

    #将日志文件名及后缀与正则表达式做对比返回yyyy-mm-dd格式的日期值(如2018-09-10)

    fileDate=$( expr "$fileName" : '.*\([0-9]\{4\}\-[0-9]\{2\}\-[0-9]\{2\}\).*.*' )    

    #将日期转换为时间戳

    fileDateTimeStamp=`date -d "$fileDate" +%s`

    #当时间戳值不为空且大于等于起始日期小于当前日期,那么获取该日志文件

    if [ "$fileDateTimeStamp" != "" ] && [ $fileDateTimeStamp -ge $sevenTimeStamp ] && [ $fileDateTimeStamp -lt $currentTimeStamp ]

    then

        fileList[$index]="$filePath/$fileName"

    else

        fileList[$index]=""

    fi

    (( index ++ ))

done

#获取所有在日期范围内的日志文件, @代表所有

meetConFiles=${fileList[@]}

#符合条件的日志文件数大于0就打包压缩

if [ "${#meetConFiles}" -gt 0 ]

then

tar -zcvf $currentDate.tar.gz $meetConFiles

else

echo "Not found the meet condition's files!"

exit 0

fi

echo "$currentDate.tar.gz create completion, Now begin to delete old files."

#删除已被打包压缩的日志文件

rm -fr $meetConFiles

echo "done."

exit 0
 

 源码图

Linux定时对日志批量打包Shell脚本

三、配置Crontab文件

 

Linux定时对日志批量打包Shell脚本

 

Linux定时对日志批量打包Shell脚本

注意:

1. CentOS 7的定时任务写在该文件中会报错。需通过crontab -e来设定定时任务

2.上图中为定期每周五执行脚本任务,可根据自身需求进行设置,其中选中行中的weblogic为执行脚本的用户,如果脚本是在root用户下,应输入root,本人的sh脚本是在自身创建的weblogic用户下。

3. MAILTO:接收定时任务邮件的用户名,对于定位定时任务脚本执行产生异常很有帮助。本人的用户名我为weblogic

四、常见问题(执行脚本)

1、permission denied(文件权限不允许)

     为了获得执行权限,切换到sh脚本所在目录,借助chmod指令修改文件权限即可。

     chmod 777 timePackLogs.sh(自身创建的脚本、)

2、本人初次接触Shell脚本开发该功能时,主要在正则表达式方面花了较多时间,建议同学多花些时间学习了解下Shell的正则表      达式。

3、查看crontab的日志记录定位定时任务问题

     当定时执行脚本发生异常时,可通过定时任务的日志来定位问题

     Linux

            a.查阅文件 /var/log/cron,可以用tail -f /var/log/cron观察(普通用户无法查看,需root超管用户)

          b.在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况。(root为用户名,本人定时任务脚本生成的日志在weblogic下,所以为/var/spool/mail/weblogic中)