You can modify it to meet your needs.
# Log rotation LOG_DIR=${HOME}/bin/log LOG="${LOG_DIR}/my_script.log" LogRotate () { # Deletes old log file if [ -f $LOG ] ; then CNT=5 let P_CNT=CNT-1 if [ -f ${LOG}.5 ] ; then rm ${LOG}.5 fi # Renames logs .1 trough .4 while [[ $CNT -ne 1 ]] ; do if [ -f ${LOG}.${P_CNT} ] ; then mv ${LOG}.${P_CNT} ${LOG}.${CNT} let CNT=CNT-1 let P_CNT=P_CNT-1 fi done # Renames current log to .1 mv $LOG ${LOG}.1 echo "" > $LOG fi }
5 comments:
Many thanks, works like a charm...
...except that you do not have yet so many logfiles (4 in this case), then you end up in an endless loop ;)
One may want to change the loop-part to
while [[ $CNT -ne 1 ]] ; do
if [ -f ${LOG}.${P_CNT} ] ; then
mv ${LOG}.${P_CNT} ${LOG}.${CNT}
fi
let CNT=CNT-1
let P_CNT=P_CNT-1
done
Many thanks, works like a charm...
...except that you do not have yet so many logfiles (4 in this case), then you end up in an endless loop ;)
One may want to change the loop-part to
while [[ $CNT -ne 1 ]] ; do
if [ -f ${LOG}.${P_CNT} ] ; then
mv ${LOG}.${P_CNT} ${LOG}.${CNT}
fi
let CNT=CNT-1
let P_CNT=P_CNT-1
done
to prevent this.
Thanks for the quick solution.
I just modified it little more - to make the function take parameters so that you can specify the number of files to retain etc.
#!/bin/bash
# Log rotation
LOG_DIR=.
LOG="${LOG_DIR}/my_script.log"
LogRotate () {
local f="$1"
local limit=$2
# Deletes old log file
if [ -f $f ] ; then
CNT=${limit}
let P_CNT=CNT-1
if [ -f ${f}.${limit} ] ; then
rm ${f}.${limit}
fi
# Renames logs .1 trough .4
while [[ $CNT -ne 1 ]] ; do
if [ -f ${f}.${P_CNT} ] ; then
mv ${f}.${P_CNT} ${f}.${CNT}
fi
let CNT=CNT-1
let P_CNT=P_CNT-1
done
# Renames current log to .1
mv $f ${f}.1
echo "" > $f
fi
}
LogRotate $LOG 10
If I want to keep 100 files just to replace 5 with 100 ?
I have been looking for this quite a long time. Thanks a lot. Works perfect!
Post a Comment