Bash脚本日志文件轮转

8
我的bash脚本会生成一个日志文件。现在我想实现一些日志文件的轮换。假设第一次被调用是'somelog.log',下一次将其重命名为'somelog.log.1'并创建新的日志文件'somelog.log'。第三次新的日志仍然是'somelog.log',但是'somelog.log.1'被重命名为'somelog.log.2',而旧的'somelog.log'被重命名为'somelog.log.1'。我希望最多可保留5个日志文件。之前有人这样做过吗(示例脚本),有何建议?感激不尽。

1
logrotate 是什么? - Bertrand Marron
1
已经在这里回答了。链接 - John Doe
2个回答

3

试试这个bash函数,它需要两个参数:

  1. 文件大小超过此值(以兆字节为单位)时应旋转的最大值(否则将不做更改)
  2. 文件的完整路径。

源代码:

function rotate () {
  # minimum file size to rotate in MBi:
  local MB="$1"
  # filename to rotate (full path)
  local F="$2"
  local msize="$((1024*1024*${MB}))"
  test -e "$F" || return 2

  local D="$(dirname "$F")"
  local E=${F##*.}
  local B="$(basename "$F" ."$E")"

  local s=

  echo "rotate msize=$msize file=$F -> $D | $B | $E"
  if [ "$(stat --printf %s "$F")" -ge $msize ] ; then
     for i in 8 9 7 6 5 4 3 2 1 0; do 
       s="$D/$B-$i.$E"
       test -e "$s" && mv $s "$D/$B-$((i+1)).$E"
  # emtpy command is need to avoid exit iteration if test fails:
       :;
     done &&
     mv $F $D/$B-0.$E
  else
     echo "rotate skip: $F < $msize, skip"
  fi
  return $?
}

1
我刚刚为此编写了一个bash脚本: https://github.com/lingtalfi/logrotator 它基本上检查日志文件的大小,如果超过任意阈值,就会将日志文件复制到日志目录中。
它适用于cron,也可以手动使用。
典型的命令看起来像这样:
> ./logrotator.sh -f private/log -m {fileName}.{datetime}.txt -v

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接