问题:老项目使用的log4j,不能设定最多保存多久的日志,所以准备再线上机器每天定时跑一个脚本。删除当天过期的日志
例:/data/***/logs /data/***/bussinesslog
现状:日志基本都在/data下面,先是集群名的文件加,再往里就是日志文件夹(bussinesslog、logs),再往里就是真正的日志,里面真正的日志文件又有很多,文件名称格式不完全统一,但是都带有日期,分隔符都是 '-'
1.上传附件 delete_log4j.sh ,默认保存十五天的日志,比如今天是12/10日,今天运行就会删除/data/文件夹/文件夹/2020-11-25 的日志
如果运行报错
执行 vim /data/delete_log4j.sh
i
:set ff=unix 把windows下的换行符\r\n换成linux的换行\n
esc按键 :wq
2.创建cron定时任务(不需要root权限)
crontab -l -- 查看定时任务 * * * * * 从前到后每个*对应的取值范围分别是 分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期几(1-7)
crontab -e 编辑定时任务
* 1 * * * /bin/sh /data/delete_log4j.sh >>/data/cron.log 每天凌晨一点执行
使用中遇到的问题是:手动调用sh执行成功。加入定时任务执行不成功,原因是加入定时任务的执行脚本都需要使用绝对路径,在任何地方
排查问题的思路:
1. systemctl status crond.service 查看定时任务服务的运行状态,下图标识在运行(否则的话可以 systemctl start crond.service 启动 其他命令:systemctl stop crond.service systemctl restart crond.service ,这些命令都没有提示信息)
2.查看cron执行日志tail -f 200/var/log/cron(需要root权限)可以看到自己的定时任务
执行结果会发邮件,邮件服务有问题的话需要修改/etc/postfix/main.cf文件中 inet_interfaces = localhost 为 inet_interfaces = all再次启动postfix服务正常,启动的命令和上面cron启动命令一致,服务名称更换即可
但是都是需要root权限
查看日志可以去/data/cron.log
#!/bin/bash
#获取文件夹下所有文件
#
folder="/data"
#当前时间
curdate=$(date "+%Y-%m-%d")
#日志保留天数
todeletedate=$(date --date='15 day ago' "+%Y-%m-%d")
echo "===========now time: ${curdate} begin delet log for :${todeletedate}============="
#if [[ $todeletedate == "" ]]
#then
# echo "curdate: ${curdate} ,todeletedate : ${todeletedate} is empty"
# return
#fi
echo "===========123"
softfiles=$(ls $folder)
echo "===========${softfiles}"
for sdec in ${softfiles}
do
echo "===========${sdec}"
if [[ -d $folder/$sdec ]]
then
echo "desc: $folder/${sdec}"
logdescs=$(ls $folder/$sdec)
for logdec in ${logdescs}
do
echo "cur desc: ${logdec} delete for:---/data/${sdec}/${logdec}/*${todeletedate}*"
rm -rf /data/${sdec}/${logdec}/*${todeletedate}*
done
fi
if [[ -f $folder/$sdec ]]
then
echo "soft: $folder/${sdec}"
fi
done