Linux定时分割并定时删除过期日志

287 阅读2分钟

参考文档:www.cnblogs.com/bkyzc/p/176…

通过 nohup 命令启动应用后,默认会生成 nohup.out 的日志文件,而且这个文件会随着时间的推移变得越来越大,不但不方便查看,也没有办法直接删除。所以设定了如下目标

  • 将日志按照日期进行分割
  • 定期将指定日期前的日志进行删除

1. 创建 shell 脚本

1.1. 创建日志操作工具 log_tools.sh

## 脚本参数设置
# 参数设置
log_dir="$1"        # 文件所在绝对目录
log_base_name="$2"  # 待处理的文件名
log_suffix="$3"     # .log    文件后缀名
op_date="$4"        # +7  7天前
if [ -f "$log_dir/$log_base_name" ]; then
# 将当天生成的日志文件copy到备份文件中,并按照日期给备份文件命名
cp $log_dir/$log_base_name $log_dir/$log_base_name.`date -d yesterday +%Y-%m-%d`$log_suffix
# 清空默认文件
:> $log_dir/$log_base_name
fi
# 删除指定日期之前的日志
find $log_dir -mtime $op_date -name $log_base_name*$log_suffix | xargs rm -f
## 或者 find $log_dir -mtime $op_date -name $log_base_name*$log_suffix -exec rm -rf {} ;

### 说明
## log_dir 是日志文件所在的目录。
## -name "*.log" 表示匹配所有以.log结尾的文件。
## -mtime +10 表示修改时间超过10天的文件。
## -exec rm -f {} ; 对于每个匹配的文件,执行rm -f删除它。
## 确保在执行此命令前仔细检查,以防不小心删除重要文件。可以先运行不带-exec的命令来查看将要删除的文件列表
## 另外,如果文件数量非常多,可以使用xargs来避免-exec命令行长度问题
## find /path/to/logs -name "*.log" -mtime +10 | xargs rm -f

1.2. 创建工具使用脚本 clear_nacos_log.sh

以清除 nacos 日志为例

# 注意:脚本中的路径都必须使用角对路径,否则crontab执行时会出现问题
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/bin/logs access_log .log +7
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/logs config-pull-check.log .0 +7
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/logs config-client-request.log .0 +7
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/logs alipay-jraft.log .0 +7
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/logs nacos.log .0 +7
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/logs naming-performance.log .0 +7
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/logs naming-raft.log .0 +7
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/logs naming-push.log .0 +7
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/logs naming-server.log .0 +7
sh /data/svc/sh/log_tools.sh /data/zb/soft/nacos/logs nacos-persistence.log .0 +7

1.3. 添加脚本执行权限

chmod u+x ./log_tools.sh

chmod u+x ./clear_nacos_log.sh

1.4. 使用脚本注意事项

1.4.1. 如果执行中出现如下错误:cp: cannot stat '/usr/local/'$'\r''/nohup.out': No such file or directory

是因为Shell脚本在Windows系统编写时,每行结尾是\r\n,而在Linux系统中行每行结尾是\n,所以在Linux系统中运行脚本时,会认为\r是一个字符,导致运行错误。执行以下命令去除Shell脚本中的\r字符:sed -i 's/\r//' log.sh

1.4.2. 如果提示权限不足,执行以下命令增加权限

chmod 777 ./log.sh

chmod +x ./clear_nacos_log.sh // 添加执行权限

2. 设置定时任务执行脚本

  • 配置定时任务
crontab -e  # 打开定时任务编辑页面
crontab -l  # 列出定时任务
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
  • 添加定时任务,当有多个定时任务时,添加多行记录即可 0 0 * * * sh /data/svc/sh/clear_nacos_log.sh
  • 重启定时任务配置使用新增任务生效 systemctl restart crond.service

3. 测试脚本执行情况

  bash -x ./log_tools.sh /data/soft/nacos/bin/logs access_log .log +15

脚本执行后会在控制台打印其中执行的文件,可以用来检查参数是否正常替换