定时删除线上日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 定时删除线上日志,crontab,shell

使用场景

接手的项目日志的量太大,经常让机器磁盘报警,频率非常高,查看后发现并不是所有的日志文件都很大,而是某几个日志文件比较大,使用的是DailyRollingFileAppender,每天都会产生一个大的日志文件,格式基本是文件名加日期,cndata.log.2016-09-27,这几个日志文件也不太重要,所以想用定时任务当磁盘使用率到达一定的数量后自动删除这些大的日志文件。这是一个治标的办法,可以省去删日志的时间,但是日志这么多还是要优化下。

使用方法

在机器上执行 sudo crontab -u root -e命令,在编辑窗口新增

*/10 * * * * /bin/sh /home/lq/delete_log.sh -c 80 -f hbase.log,cndata.log -p /home/admin/logs -b 1 -l 3

/home/lq/delete_log.sh 是脚本的路径,-c表示磁盘使用率到多少开始删除日志,-f表示需要删除的日志文件名,多个日志文件用逗号分隔,-p表示日志所在文件夹的路径,-b表示从哪天开始删除,1表示昨天,2表示前天,以此类推,-l表示需要删除几天的日志量。

我这边配置的表示每10分钟执行一次删除日志工作,如果磁盘容量到达80%,就删除昨天、前天、大前天的hbase.log和cndata.log日志

通过sudo crontab -u root -l可以查看任务是否添加成功

通过sudo /sbin/service crond reload命令可以手动重新加载定时任务

脚本代码(delete_log.sh)

#!/bin/sh
while getopts "p:c:f:b:l:" arg #选项后面的冒号表示该选项需要参数
do
    case $arg in
        p)
                        #日志路径
                        logPath=$OPTARG
                        ;;
        c)
                        #磁盘使用率到达多少开始删除日志
                        alarmCapacity=$OPTARG
                        ;;
        f)
                        #需要删除的文件名,多个用逗号分隔
                        deleteLogFileNames=$OPTARG
                        ;;
        b)
                        #开始删除的日期,1代表昨天,2代表前天,以此类推
                        dayBegin=$OPTARG
                        ;;
        l)
                        #需要删除的天数,如果dayBegin为1,dayLength为3,表示删除昨天、前天、大前天的日志
                        dayLength=$OPTARG
                        ;;
        ?)             #当有不认识的选项的时候arg为?
                        echo "unkonw argument"
                        exit 1
                ;;
    esac
done
#默认删除三天 也就是删除昨天、前天、大前天的日志
if [ -z "$dayBegin" ]&&[ -z "$dayLength" ];then
        dayBegin=1
        dayLength=3
fi


if [ -z "$logPath" ]||[ -z "$alarmCapacity" ]||[ -z "$deleteLogFileNames" ]||[ -z "$dayBegin" ]||[ -z "$dayLength" ]
then
echo "arg is not valid"
exit 10
fi

#如果输入的路径最后没有斜杠,补上斜杠
if ! [[ "$logPath" =~ '/$' ]];then
logPath=${logPath}/
fi


dayLength=`expr $dayBegin + $dayLength`

#分隔需要删除的文件名
OLD_IFS="$IFS"
IFS=","
arr=($deleteLogFileNames)
IFS="$OLD_IFS"

#获取磁盘使用率
diskCapacity=`df -h / |awk '{print$5}'|grep '^[0-9][0-9]*%$'`
diskCapacity=${diskCapacity%?}

#临时目录,存放需要删除的日志文件
tmpDir=${logPath}logbak_`date +"%F"`

#定义任务日志,方便查询删除了哪些文件
resultLog=${logPath}/crontab.log
if [ ! -f "$resultLog" ];then
        touch "$resultLog"
fi

#磁盘使用率操过用户输入的报警值,开始删除日志
if [[ $(echo "$diskCapacity>$alarmCapacity"|bc) -eq 1 ]];then
for((serialNumber=$dayBegin;serialNumber<$dayLength;serialNumber++))
do
serialNumberDayTime=`date -d"$serialNumber day ago" +"%F"`
        for fileName in ${arr[@]}
           do
               preDeleteFile=${logPath}${fileName}.${serialNumberDayTime}
               if [ -f "$preDeleteFile" ];then
                  if [ ! -d "$tmpDir" ];then
                        mkdir $tmpDir
                  fi
                  #把需要删除的日志放在临时目录下
                  mv $preDeleteFile $tmpDir
               fi
           done
done
#删除日志
date "+%G-%m-%d %H:%M:%S">>"$resultLog"
ls -l $tmpDir|grep -v total|awk '{print$9}'>>"$resultLog"
rm -rf $tmpDir
fi
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
310 1
|
Shell Linux 开发工具
Linux定时清理日志
Linux定时清理日志
208 0
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
|
6月前
|
关系型数据库 MySQL 调度
实时计算 Flink版产品使用合集之归档日志定时清理导致任务失败如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
Linux
百度搜索:蓝易云 ,Linux系统定时清空日志内容和删除日志文件教程。
通过以上步骤,您可以在Linux系统中设置cron作业来定期清空日志内容和删除日志文件。请确保在编辑cron作业之前,您具有足够的权限来访问和修改日志文件。
68 0
|
6月前
|
存储 应用服务中间件 nginx
nginx日志定时切割 按年月日
nginx日志定时切割 按年月日
60 0
|
Shell Linux
Linux使用Shell脚本定时清理日志
Linux使用Shell脚本定时清理日志
177 1
|
Unix Linux Shell
Linux 下使用crontab 定时打包日志并删除已被打包的日志
f=`ls /home/hls/apache-tomcat-7.0.61/logs -1 -c` #获取logs下文件列表( /home/hls/apache-tomcat-7.0.61/logs 是日志的所在的路径)
76 0
|
Unix Linux Shell
Linux 下使用crontab 定时打包日志并删除已被打包的日志
crontab是和用户相关的,每个用户有自己对应的crontab 。 cron是Linux下的定时执行工具,以下是重启/关闭等等的命令
95 0
|
弹性计算 Cloud Native Ubuntu
实现docker镜像中使用crontab定时删除n天前日志
实现docker镜像中使用crontab定时删除n天前日志
855 0