编写一个日志轮询归档脚本

回复 收藏

类似于日志切割,系统有个logrotate程序,可以完成归档。但现在我们要自己写一个shell脚本实现归档。 举例: 假如服务的输出日志是1.log,我要求每天归档一个,1.log第二天就变成1.log.1,第三天1.log.2, 第四天 1.log.3  一直到1.log.5。下面是我的一个参考脚本,供大家参考:

#!/bin/bash

function e_df()

{

    [ -f $1 ] && rm -f $1

}

for i in `seq 5 -1 2`

do

    i2=$[$i-1]

    e_df /data/1.log.$i

    if [ -f /data/1.log.$i2 ]

    then

        mv /data/1.log.$i2 /data/1.log.$i

    fi

done

e_df /data/1.log.1

mv /data/1.log  /data/1.log.1

2015-09-29 09:54 举报
已邀请:
0

定海偶然

赞同来自:

瞅瞅
0

cmzsteven

赞同来自:

看一下
0

一笑而过

赞同来自:

学习一下。
0

think

赞同来自:

看一下
0

wuhen

赞同来自:

看看,学习一下
0

balich

赞同来自:

扩展学习
0

tkk

赞同来自:

look
0

wzwyql

赞同来自:

1
0

北辰星

赞同来自:

学习
0

北辰星

赞同来自:

我怎么发现我理解不了
0

北辰星

赞同来自:

我怎么发现我理解不了
0

ringle000

赞同来自:

学习下
0

664778717@qq.co

赞同来自:

学习。。。。。
0

lky

赞同来自:

学习
0

xpgong

赞同来自:

学习一下
0

robert

赞同来自:

lala
0

ayu

赞同来自:

see see
0

s_jxiaobo

赞同来自:

研究研究
0

tutu

赞同来自:

看下
0

cnshark

赞同来自:

思路有了,先看看怎么写规范点,嘿嘿
0

huguihua2002

赞同来自:

看看
0

邱石

赞同来自:

学习一下
0

老杆儿

赞同来自:

if [ -f 1.log* ];then
     i=$(($i+1))
#     echo $i
       mv 1.log* 1.log.$i
       echo $i
    fi
# i=$(($i+1))
#echo $i
export i=$i

#  echo $i
其中我注释的内容是我在测试时用来测试的,可以不用看。

1.用export声称变量i=1
2.将上面脚本内容写入脚本
3.用source 执行脚本,用sh直接执行不可以,因为source执行时会在父进程中执行。
4,将脚本写入周期性计划任务 crontab -e "59 23 * * * source /root/ceshi.sh"
5.需要注意用户身份及文件权限的设置。


0

张磊磊

赞同来自:

看一下
0

哈哈琨少

赞同来自:

学习学习
0

黄仁伟

赞同来自:

学习
0

demon_l

赞同来自:

学习
0

faith

赞同来自:

{:4_91:}
0

小指头

赞同来自:

学习
0

wudi61

赞同来自:

学习
0

Shawn

赞同来自:

编不出来
0

Shawn

赞同来自:

但是铭哥,你的时间是怎么定义的,没有是时间的概念,怎么以天为单位生成啊
0

沈诚

赞同来自:

学习一下
0

黑色的梦

赞同来自:

1
0

phper

赞同来自:

学习一下
0

xieqilang

赞同来自:

看看
0

wanjj

赞同来自:

答案
0

oneliang

赞同来自:

看看
0

demon_l

赞同来自:

#!/bin/bash
logdir=/data
function ed_f()
{
    [ -f $1 ] && rm -f $1

}
ed_f /data/1.log.5
for i in `seq 5 -1 2`
do
    j=$[$i-1]
    if  [ -f $logdir/1.log.$j ]
    then
        mv $logdir/1.log.$j /data/1.log.$i
    fi
done
    cp  $logdir/1.log $logdir/1.log.1
    echo  > $logdir/1.log
0

阿铭老师 管理员

赞同来自:

Shawn 发表于 2015-10-15 21:06
但是铭哥,你的时间是怎么定义的,没有是时间的概念,怎么以天为单位生成啊

每日固定时间执行一次。 写cron
0

xteplinux

赞同来自:

看看
0

贾永久

赞同来自:

看一看
0

krven

赞同来自:

看看
0

linux6688

赞同来自:

123456789
0

zhangmengjun

赞同来自:

看看
0

自己定义

赞同来自:

看一下
0

yanggang

赞同来自:

0

howiewang

赞同来自:

研究研究
0

温柔的笑猫

赞同来自:

学习
0

两天

赞同来自:

瞅瞅
0

老咸菜

赞同来自:

学习一下
0

gjc159357

赞同来自:

看看
0

smiock

赞同来自:

瞅瞅
0

Linuxpp

赞同来自:

学习
0

zhangzihao

赞同来自:

123
0

hlymlv

赞同来自:

看看
0

qqq998492

赞同来自:

学习下
0

汤小东

赞同来自:

learn
0

xebszw

赞同来自:

看看轮询思路
0

yangjian319

赞同来自:

学习一下。
0

ldp840611

赞同来自:

看看
0

xueyongbo

赞同来自:

本帖最后由 xueyongbo 于 2015-12-7 21:00 编辑

采取两个脚本," rotate.conf.sh " 为配置脚本,读取用户输入的日志文件路径后,会向 /var/spool/root` 的目录下写入定时任务。" 0 0 * * * /bin/sh /root/shell/log_rotate.sh $log_patch " ," $log_patch" 作为一个参数传入" log_rotate.sh" 日志轮替脚本。扩展了日志轮替的日志范围。

rotate.conf.sh (配置需轮替的日志)
  1. #!/bin/bash

  2. # 2015/12/7 17:00
  3. # By xueyongbo

  4. read -p "please input your log_patch: " log_patch

  5. while :
  6. do
  7.         log_name=$(basename $log_patch)
  8.         cd $(dirname $log_patch)
  9.         if [ -f $log_name ];then
  10.                 echo "0 0 * * * /bin/sh /var/shell/log_rotate.sh $log_patch " >> /var/spool/$(whoami)
  11.                 break
  12.         else
  13.                 read -p "The log file isn't found.input retry: " log_patch
  14.         fi
  15. done

log_rotate.sh (执行日志轮替的脚本,位置:/var/shell/log_rotate.sh)

  1. #!/bin/bash

  2. # 2015/12/7 16:30
  3. # By xueyongbo

  4. log_patch=$1
  5. cd `dirname $log_patch`
  6. log_name=`basename $log_patch`

  7. if [ -f $log_name.5 ];then
  8.         rm -rf $log_name.5
  9. else
  10.         for ((i=4;i>=0;i--))
  11.         do
  12.                 if [ -f $log_name.$i ];then
  13.                         mv $log_name.$i $log_name.$((i+1))
  14.                 elif [ $i -eq 0 ];then
  15.                         mv $log_name $log_name.1
  16.                         touch $log_name
  17.                 else
  18.                         continue
  19.                 fi
  20.         done

  21. fi




0

minlyf

赞同来自:

看看
0

空港

赞同来自:

瞅瞅
0

王焱峰

赞同来自:

看看
0

追风者

赞同来自:

1
0

石头

赞同来自:

~~
0

J!_yuan

赞同来自:

看看
0

syk

赞同来自:

看看
0

lyhabc

赞同来自:

来看看   
0

我是学渣

赞同来自:

kk
0

weifeng1463

赞同来自:

ok
0

毛智杰

赞同来自:

学习
0

licengceng

赞同来自:

学习
0

Rohero

赞同来自:

学习
0

HMOM

赞同来自:

学习
0

lin19890913

赞同来自:

看看
0

thedawn

赞同来自:

1
0

KICAZ629

赞同来自:

qq
0

落涧飞鹰

赞同来自:

看看
0

泡沫。

赞同来自:

1111
0

出VU时代

赞同来自:

学习了
0

miaojianbo

赞同来自:

11111
0

北辰星

赞同来自:

铭哥,感觉您写的顺序有些问题啊,怎么会是从5到1呢?我写了一个别的,和您这个差不多
#!/bin/bash
function e_df()
{
    [ -f $1 ] && rm -rf $1
}

e_df /root/1.log.1
mv /root/1.log /root/1.log.1

for i in `seq 1 5`
do
    i2=$[$i+1]
    if [ -f /root/1.log.$i ]
    then
           mv /root/1.log.$i /root/1.log.$i2
    fi
sleep 86400
done
0

hhx012

赞同来自:

瞅瞅
0

boy461205160

赞同来自:

look
0

ifisis

赞同来自:

kankan
0

maria

赞同来自:

瞅瞅
0

HwangChen

赞同来自:

look
0

xteplinux

赞同来自:

看看
0

ttly123

赞同来自:

看看
0

liushuangwei

赞同来自:

#!/bin/bash
## just a test programme,named log.sh
cd  /log
[ -f ./1.log.5 ] && rm -rf 1.log.5
for q in `seq 4 |sort -rn`;do
[ -f ./1.log.$q ] && mv 1.log.$q 1.log.$[$q+1]
done
[ -f ./1.log ] && mv 1.log 1.log.1
echo "">1.log

crontab -e
0 24 * * * /bin/bash /log.sh
0

summer123

赞同来自:

看看,学习一下
0

wsw13640218682

赞同来自:

本帖最后由 wsw13640218682 于 2016-2-21 21:40 编辑

#!/bin/bash
d=`date +%S`
for i in `seq 1  6`
do
if [ $d -eq 86400 ]  && [ $i  -lt  6 ]
then
mv 1.log 1.log.$icontinue
else
rm -rf 1.log.$i
fi
done



0

lin13750529011

赞同来自:

谢谢
0

不怕不怕

赞同来自:

正好碰到类似问题
0

xzzlamp

赞同来自:

11
0

jinm

赞同来自:

学习
0

乐橙306

赞同来自:

1
0

zhangdailu

赞同来自:

学习

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: