使用类似 logrotate 的后缀分割大型日志文件

使用类似 logrotate 的后缀分割大型日志文件

我发现我忘记在一台服务器上为 php5-fpm.log 添加 logrotate-conf,现在发现它已经变得非常大,我问自己如何将此日志文件拆分为单独的文件,并使用像 logrotate 会生成的后缀。你知道...就像这个错误从未发生过一样 :-P

但我想到的最接近的答案是:

split -C 10m -d php5-fpm.log php5-fpm.log.

...但这会产生如下文件:

php5-fpm.log.00
php5-fpm.log.01
php5-fpm.log.02
...

从后缀中删除前导零是一个简单的任务,并且可以轻松地手动完成。但我的问题是:我如何才能恢复后缀,以便后缀最高的文件变成后缀最低的文件?

答案1

要缩短后缀长度(消除零),可以执行以下操作:

$ split --suffix-length=1 -C 10m -d php5-fpm.log php5-fpm.log.

不幸的是,没有可以传递给 split 的参数来反转后缀,但您可以使用 tac 而不是 cat,然后反转文件并将其传递给 split 命令,如下所示:

$ tac php5-fpm.log | split --suffix-length=1 -C 10m -d - php5-fpm.log.

现在您需要做的就是再次反转分割文件(并在进行此操作时对其进行压缩):)

$ for i in php5-fpm.log.*; do tac $i | gzip > $i.gz; rm -f $i; done

编辑:

如果您不想使用 tac,还有另一种方法可以解决此问题:

split --suffix-length=1 -C 10m -d php5-fpm.log php5-fpm.
export COUNT=$(expr $(ls php5-fpm.[0-9] | wc -l) - 1)
for i in $(seq 0 $COUNT); do
    mv php5-fpm.$i php5-fpm.log.$(expr $COUNT - $i);
done

第一个命令将大日志文件拆分为几个较小的文件:php5-fpm.0 php5-fpm.1 php5-fpm.2...稍后,您将计算文件数量,并且仅使用 bash 表达式求值的力量来反转数字:expr(1)。

答案2

你可以用这个快速而粗糙的 shell 脚本来实现重命名部分:

#!/bin/bash
for x in php5-fpm.log.*
do
  max=${x/php5-fpm.log./}
done
mkdir renamed-files || exit 1
for x in php5-fpm.log.*
do
  num=${x/php5-fpm.log./}
  let num=max-num+1
  mv $x renamed-files/php5-fpm.log.$num
done
mv renamed-files/* .
rmdir renamed-files

请注意,重命名的文件被收集在子目录中,以避免与尚未重命名的文件发生名称冲突。

renamed-files还请注意,如果无法创建子目录(例如因为存在同名文件),则在 mkdir 之后退出。在这种情况下,继续执行脚本可能会产生不可逆转的不良影响。

相关内容