类似于日志切割,系统有个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
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.需要注意用户身份及文件权限的设置。
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
#!/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
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
本帖最后由 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 (配置需轮替的日志)
log_rotate.sh (执行日志轮替的脚本,位置:/var/shell/log_rotate.sh)
采取两个脚本," 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 (配置需轮替的日志)
- #!/bin/bash
- # 2015/12/7 17:00
- # By xueyongbo
- read -p "please input your log_patch: " log_patch
- while :
- do
- log_name=$(basename $log_patch)
- cd $(dirname $log_patch)
- if [ -f $log_name ];then
- echo "0 0 * * * /bin/sh /var/shell/log_rotate.sh $log_patch " >> /var/spool/$(whoami)
- break
- else
- read -p "The log file isn't found.input retry: " log_patch
- fi
- done
log_rotate.sh (执行日志轮替的脚本,位置:/var/shell/log_rotate.sh)
- #!/bin/bash
- # 2015/12/7 16:30
- # By xueyongbo
- log_patch=$1
- cd `dirname $log_patch`
- log_name=`basename $log_patch`
- if [ -f $log_name.5 ];then
- rm -rf $log_name.5
- else
- for ((i=4;i>=0;i--))
- do
- if [ -f $log_name.$i ];then
- mv $log_name.$i $log_name.$((i+1))
- elif [ $i -eq 0 ];then
- mv $log_name $log_name.1
- touch $log_name
- else
- continue
- fi
- done
- fi
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
#!/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
#!/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
## 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
编辑回复