shell实现日志滚动

什么是日志滚动?

在日常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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章