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 协议》,转载必须注明作者和本文链接