Linux rotiert Logfiles in mehreren Stufen. Dabei gibt es verschiedene Möglichkeiten wie diese Logfiles aussehen können.
# Variante 1
logfile.log
logfile.log.0.gz
logfile.log.1.gz
logfile.log.2.gz
# Variante 2
maillog
maillog-20220828
maillog-20220904
maillog-20220911
maillog-20220918
Der Hintergrund eines solchen rotierenden Logfiles ist es, die Dateien einerseits nicht zu gross werden zu lassen und andererseits, sollten sie gzip komprimiert sein, auch Platz zu sparen.
Hier habe hier zwei Varianten für ein solches Logrotate Script:
Logrotate nach fixem Zeitraum
#!/bin/sh
# Log directory
LOGDIR=/data/logs
# Maximum number of archive logs to keep
MAXNUM=30
#Log files to be handled in that log directory
files=(access.log error.log)
for LOGFILE in "${files[@]}"
do
## Check if the last log archive exists and delete it.
if [ -f $LOGDIR/$LOGFILE.$MAXNUM.gz ]; then
rm $LOGDIR/$LOGFILE.$MAXNUM.gz
fi
NUM=$(($MAXNUM - 1))
## Check the previous log file.
while [ $NUM -ge 0 ]
do
NUM1=$(($NUM + 1))
if [ -f $LOGDIR/$LOGFILE.$NUM.gz ]; then
mv $LOGDIR/$LOGFILE.$NUM.gz $LOGDIR/$LOGFILE.$NUM1.gz
fi
NUM=$(($NUM - 1))
done
# Compress and clear the log file
if [ -f $LOGDIR/$LOGFILE ]; then
cat $LOGDIR/$LOGFILE | gzip > $LOGDIR/$LOGFILE.0.gz
cat /dev/null > $LOGDIR/$LOGFILE
fi
done
Logrotate nach Filegrösse
#!/bin/bash
checkSizeOver() {
typeset -i LFSB LFSM LOG_SIZE=10
LF=$1
LOG_SIZE=$2
LFSB=$(stat -c "%s" $LF)
# This is bytes - turn into MB, base 2}
LFSM=${LFSB}/1048576
# This is bytes - turn into MB, base 2
if [ $LFSM -gt $LOG_SIZE ]
then
return 0
else
return 1
fi
}
LOG_PATH=$1
OLD_LOG_PATH=$2
for file in $LOG_PATH/*.log
do
SIZE=10
NAME=$(basename $file)
now="$(date +'%Y-%m-%d_%H-%m')"
if checkSizeOver $file $SIZE;
then
DEST=$OLD_LOG_PATH/$NAME.$now
mv $file $DEST
echo Logfile $file is greater than $SIZE MB
else
echo Logfile $file is less than $SIZE MB
fi
done