Shell脚本对项目日志进行打包压缩(打包上个月1号到月底)

1.使用场景

在服务器上,由于每天会产生很多的日志文件,长久以来,文件数量越来越多,可以采用脚本的方式,定时为每个月的日志进行汇总打包,如果不想要了可以直接rm 。没有用什么现成工具之类的,就自己写了一个shell脚本,灵活多变。

  • 日志场景
    // 项目日志位置
    [root@Centos7 logs]# pwd
    /home/s/apps/myproject/storage/logs
    // 日志目录样例
    [root@Centos7 logs]# ls
    api.log.20211221  api.log.20211222 api.log.20211223
    api2.log.20211221  api2.log.20211222 api2.log.20211223

2.Shell程序

#!/bin/sh
###
 # @Description: Shell脚本进行日志打包压缩(打包上个月1号到月底)
 # @Author: tacks321@qq.com
 # @Date: 2020-11-25 18:55:35
### 

# 日志遍历的根目录 (后面不加斜杠)
LOG_PATH=/home/s/apps/myproject/storage/logs
# 打包日志的目录前缀 (例如 log_bak_202010.tar.gz)
LOG_PREFIX=log_bak_


# 本月第一天
nowFristDay=`date +%Y-%m-01`

# 上个月
lastMonth=`date -d"$nowFristDay last month" +%Y%m`
# 打包起始日期 (上个月一号)
startDate=`date -d "$nowFristDay 1 month ago" +%Y-%m-01`
startTimeStamp=`date -d "$startDate" +%s`
# 打包结束日期(上个月最后一天)
endDate=`date -d "$nowFristDay last day" +%Y-%m-%d`
endTimeStamp=`date -d "$endDate" +%s`



# 主函数定义
function main {
    dump "Start LogZip 打包程序执行开始!....";
    dump "BetweenDate 打包日期范围 [$startDate~$endDate]";

    # 压缩某个项目日志
    zipLog $LOG_PATH

    dump "End LogZip 打包程序结束!";
}



# 压缩日志
    # @param $1 某个项目日志目录 (如 /home/s/apps/myproject/storage/logs/) 
    # 日志目录的名称格式为 ( 日志名称.log.日期名称  例如:api.log.20211221 )
function zipLog {
    cd $1
    dump "【####### $1 #######】";
    dump "\t[Income] $1";
    dump "\t    [Doing] zip log file ...";

    # 所有符合要求的日志文件
    fileList=()
    # 统计个数
    index=0

    for item in `ls $1` 
    do
        filePath=$1/$item
        if [ -f "$filePath" ]
        then
            # 获取文件日期
            fileDate=${filePath:0-8}
            fileDateTimeStamp=`date -d "$fileDate" +%s 2>&1`
            if [ $? -ne  0 ]; 
            then
                continue
            fi

            # 当时间戳值不为空且大于等于起始日期小于当前日期,那么获取该日志文件
            if [ "$fileDateTimeStamp" != "" ] && [ $fileDateTimeStamp -ge $startTimeStamp ] && [ $fileDateTimeStamp -le $endTimeStamp ]
            then
                # 满足条件的日志文件
                fileList[$index]="$item"
                # 符号要求的日志的个数
                (( index ++ ))

                dump "\t\t$item";
            else
                continue
            fi

        fi
    done

    # 所有符合要求的日志
    logFiles=${fileList[@]}

    if [ "${#logFiles}" -gt 0 ]
    then
        startTime_s=`date +%s`

        # 打包名称
        package="$LOG_PREFIX$lastMonth"
        # 创建压缩包目录   
        `mkdir -p $package`
        # 剪切日志
        `mv $logFiles $package`
        # 是否已经存在
        if [ ! -f "$package.tar.gz" ]; then
            compressNmae=$package.tar.gz
        else
            suffix=`date +%H%M%S`
            compressNmae="${package}-${suffix}.tar.gz"
        fi
        # 压缩目录
        `tar -zcPf $compressNmae "$package"`
        # 删除目录
        rm -rf $package

        endTime_s=`date +%s`
        costTime=$[ $endTime_s - $startTime_s ]
        compressSize=`du -sh ${compressNmae} | awk '{print $1}'`

        dump "\t    [Done] 日志打包完成,打包文件个数:$index个, 花费时间:$costTime s, 压缩包大小:$compressSize";
        dump "\t    [Out]  $package.tar.gz"
    else
        dump "\t    [Nothing] 无需打包"
    fi

    dump "\t[Leave] $1";

    # 休眠
    sleep 3s
}


# 格式化输出
function dump {
    # 当前时间命令
    cmdTime=`date '+%Y-%m-%d %H:%M:%S'`
    printf "[$cmdTime] $1 \n"
}




# 执行主函数
main

3.执行示例

[2022-04-01 18:25:11] Start LogZip 打包程序执行开始!.... 
[2022-04-01 18:25:11] BetweenDate 打包日期范围 [2022-03-01~2022-03-31] 
[2022-04-01 18:25:11] 【####### /home/s/apps/myproject/storage/logs #######】 
[2022-04-01 18:25:11]     [Income] /home/s/apps/myproject/storage/logs 
[2022-04-01 18:25:11]         [Doing] zip log file ... 
[2022-04-01 18:25:11]         api.log.20220309 
[2022-04-01 18:25:11]         api.log.20220321 
[2022-04-01 18:25:11]         api.log.20220322 
..
[2022-04-01 18:25:12]         [Done] 日志打包完成,打包文件个数:3, 花费时间:1 s, 压缩包大小:16K 
[2022-04-01 18:25:12]         [Out]  log_bak_202203.tar.gz 
[2022-04-01 18:25:12]     [Leave] /home/s/apps/myproject/storage/logs 
本作品采用《CC 协议》,转载必须注明作者和本文链接
明天我们吃什么 悲哀藏在现实中 Tacks
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!