什么是日志滚动?
在日常linux的操作中,经常会产生各种各样的日志文件,如果不加以处理,经常会导致单个日志文件体积过于臃肿,不利于后期排查。因此需要对日志文件定期操作,比如每天将日志文件打包备份,重新编排版本号等。linux发行版中也默认安装了logrotate
这款上古神器来管理日志,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。
但是这里并不想去过多介绍logrotate
这款工具,而是着重于自己编写shell
脚本去实现类似的功能。
实现思路
- 如果日志文件没有数字后缀,那么添加数字后缀;
- 如果日志文件已经有数字后缀,那么查看数字后缀是否小于11;
- 如果日志文件数字后缀小于11,那么将日志文件数字后缀加1;
- 如果日志文件数字后缀大于等于11,那么保持不变或者等待数字后缀为10的日志文件覆盖它。
核心代码实现
for item in $list; do
local suffix=${item##*.}
local prefix=${item%.*}
expr $(($suffix+0)) 2>&1 > /dev/null
if [ $? -eq 0 ]; then
if [ $suffix -lt 11 ]; then
suffix=$(($suffix+1))
mv $item $prefix.$suffix
fi
else
mv $item $prefix.$suffix.1
fi
done
实现效果
[hadoop@li-pc ~]$ mkdir haha
[hadoop@li-pc ~]$ touch haha/{a..d}.log e.log.11
[hadoop@li-pc ~]$ ls haha
a.log b.log c.log d.log e.log.11
[hadoop@li-pc ~]$ ./shell.sh; ls haha
a.log.1 b.log.1 c.log.1 d.log.1 e.log.11
[hadoop@li-pc ~]$ ./shell.sh; ls haha
a.log.2 b.log.2 c.log.2 d.log.2 e.log.11
附件
#!/bin/bash
move_file() {
list=$@
for item in $list; do
local suffix=${item##*.}
local prefix=${item%.*}
expr $(($suffix+0)) 2>&1 > /dev/null
if [ $? -eq 0 ]; then
if [ $suffix -lt 11 ]; then
suffix=$(($suffix+1))
mv $item $prefix.$suffix
fi
else
mv $item $prefix.$suffix.1
fi
done
}
is_exisit() {
if [ -d $1 ]; then
return 0
fi
return 1
}
main() {
is_exisit $1
if [ $? -eq 0 ]; then
cd $1
list=$(ls | sort -r)
move_file $list
else
echo "The direcotry - $path - is not existed!"
fi
}
path="/home/hadoop/haha"
main $path