日志文件定期压缩清除

3次阅读

共计 1075 个字符,预计需要花费 3 分钟才能阅读完成。

对于日志, logback 支持滚动压缩文件和保留一定时间的历史文件, 但是不能保证留存最近七天的 .log 文件, 并对最近 30 天的 log 文件进行压缩处理, 所以这里就通过 shell 命令和 crontab 来实现日志文件的定期压缩清除

autoZip.sh

首先我们的日志文件命名规则是 *.%d{yyyy-MM-dd}.log, 通过 docker 挂载到本地目录集中保存, 规律是 /data/logs/*/*.log 其中 logs 下为每个服务的目录

#!/bin/bash

function tarOrClear() {

  point=`date -d '-7 day' +%s`
  point2=`date -d '-30 day' +%s`
  root=$1

  dirs=`ls -F | grep /$`

  for i in $dirs; do
    echo "========= cd $root/$i"
    cd $root/$i
    files=`ls`

    for fileName in $files; do
      prefix=${fileName%%.*}
      day=$(expr "$fileName" : '.*\([0-9]\{4\}\-[0-9]\{2\}-[0-9]\{2\}\).*' )

      if [[$day != ""]];then
        dayTime=`date -d $day +%s`

        # 30 天以外的日志直接删除
        if [[$dayTime -lt $point2]];then
          echo "rm $fileName"
          rm $fileName
        # 7 天以外的日志压缩 tar.gz, 删除原 log 文件        
        elif [[$dayTime -lt $point]];then
          if [[$fileName == *.log]] && [[! -a $prefix.$day.tar.gz]];then
            echo "tar -czf $prefix.$day.tar.gz  $fileName --remove-files"
            tar -czf $prefix.$day.tar.gz  $fileName --remove-files
          fi
        fi
      fi
    done
  done
}

if [[$# == 1]];then
  tarOrClear $1
else
  echo "请选定日志文件根目录, 日志文件位于 根目录 /*/*.log"
fi

crontab 定时任务

crontab -e 进入定时任务编辑

增加一行

0 1 * * * (sh /data/logs/autoZip.sh /data/logs) > /data/logs/console.log

保存退出

crontab -l 查看定时任务列表是否更新

这样在每天 01:00, 服务器会自动执行 autoZip.sh/data/logs/*/*.log 的日志文件进行压缩和清理

正文完
 0