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