【问题标题】:Bash script log file rotationBash 脚本日志文件轮换
【发布时间】:2011-04-11 00:58:04
【问题描述】:

我的 bash 脚本会生成一个日志文件。现在我想实现一些日志文件轮换。
假设第一次它被称为 somelog.log,下一次它被重命名为 somelog.log.1 和新的日志文件somelog.log
第三次新的日志又是somelog.log,但是somelog.log.1 重命名为 somelog.log.2,旧的 somelog.log 重命名为 somelog.log.1
我会最多可以授予例如 5 个。

这是之前完成的(示例脚本),有什么建议。我很感激任何建议。

【问题讨论】:

标签: bash file rotation logging


【解决方案1】:

我刚刚为此制作了一个 bash 脚本: https://github.com/lingtalfi/logrotator

它主要检查您的日志文件的大小,如果超过任意阈值,它会将日志文件复制到日志目录中。

它对 cron 友好,或者您也可以手动使用它。

一个典型的命令如下所示:

> ./logrotator.sh -f private/log -m {fileName}.{datetime}.txt -v

【讨论】:

    【解决方案2】:

    试试这个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 $?
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 2021-11-01
      相关资源
      最近更新 更多