Originally Posted by
adami
Как-то неправильно удалять системные логи целиком.
Полностью с этим согласен
Originally Posted by
adami
Предлагаю такой вариант скрипта
Я использую немного другой подход к ротации лога
Мой скрипт сначала очищает лог от записей cron и ntpclient, затем исходя из его размера принимает решение об архивировании. Только есть один минус. Если чегонибудь попадет в лог во время очистки то это бесследно исчезнет. В отличии от выше предложенного скрипта, в моем варианте архив не сжимается в пользу возможности удобного просмотра архива.
Code:
#!/bin/sh
# logcleaner - Скрипт для очистки и архивирования лог файла
# Папка, где лежит лог файл
logdir=/tmp
# Имя лог файла
logfilename=syslog.log
# Папка для архивирования
rotatedir=/opt/var/log/rotated
# Предельный размер лог файла в байтах
maxlogsize=102400
# Уровень архивирования
rotatedepth=5
logfile=$logdir/$logfilename
[ ! -f $logfile ] && echo "Logfile not found" && exit 1
grep -v "[\/ ]cron\[" $logfile > $logfile.tmp && mv -f $logfile.tmp $logfile
grep -v " ntp client:" $logfile > $logfile.tmp && mv -f $logfile.tmp $logfile
grep -v " Log cleaned" $logfile > $logfile.tmp && mv -f $logfile.tmp $logfile
logger "Log cleaned"
if [ ! -f $rotatedir ]; then if [ ! -d $rotatedir ]; then mkdir -p $rotatedir; fi; else echo "$rotatedir is a file"; exit 1; fi
logsize=`ls -l $logfile | awk '{print $5}'`
if [ $logsize -gt $maxlogsize ]; then
iter=$rotatedepth; while [ $iter -gt 1 ]; do
let itern=$iter-1
if [ -f "$rotatedir/$logfilename.l$itern" ]; then mv -f $rotatedir/$logfilename.l$itern $rotatedir/$logfilename.l$iter; fi
let iter=$iter-1
done
mv -f $logdir/$logfilename $rotatedir/$logfilename.l1
touch $logdir/$logfilename
logger "Log rotated. Archive logs are in $rotatedir"
fi
UPD
Новая версия скрипта. Появилась возможность сжатия архива начиная с указанного уровня. Теперь параметры принимаются из командной строки.
Code:
#!/bin/sh
#
# Использование: ./wlrotate.sh [-c gz|bz2] [-d depth] [-z depthtocompress] [-p archivepath] [-s maxlogsize] filename
# -с gz|bz2 использовать сжатие архива методом gzip(gz) или bzip2(bz2)
# -d depth уровень архивирования
# -z depth минимальный уровень архива для сжатия
# -p path путь к месту хранения архивов
# -s logsize порог размера файла в байтах, для принятия решения об архивировании
#
while [ "$1" ]; do
case $1 in
-c)
[ "$2" ] && shift && cmp=`expr $1 : '\(gz\|bz2\)'`
;;
-d)
[ "$2" ] && shift && rotatedepth=`expr $1 : '\([0-9]\+\)'`
;;
-z)
[ "$2" ] && shift && compressdepth=`expr $1 : '\([0-9]\+\)'`
;;
-s)
[ "$2" ] && shift && maxlogsize=`expr $1 : '\([0-9]\+\)'`
;;
-p)
[ "$2" ] && shift && rotatepath=`expr $1 : '\([^:*?"<>\|]*\)'`
;;
*)
logfile=`expr $1 : '\([^:*?"<>\|]*\)'`
;;
esac
shift
done
[ -z "$logfile" ] &&
echo "Usage: $0 [-c gz|bz2] [-d depth] [-z depthtocompress] [-p archivepath] [-s maxlogsize] filename" >&2 &&
exit 1
[ -z "$rotatedepth" ] && rotatedepth=10
[ -z "$compressdepth" ] && compressdepth=1
[ -z "$maxlogsize" ] && maxlogsize=0
if [ "$cmp" = "gz" ]; then
if ! gzip -h > /dev/null 2>&1; then
cmp=""
logger -s -t "$0[$$]" "Warning: Gzip not found, continue without compression"
fi
fi
if [ "$cmp" = "bz2" ]; then
if ! bzip2 --help > /dev/null 2>&1; then
cmp=""
logger -s -t "$0[$$]" "Warning: Bzip2 not found, continue without compression"
fi
fi
[ ! -e "$logfile" ] && logger -s -t "$0[$$]" "Error: File $logfile not found" >&2 && exit 1
logfilename=`echo $logfile | sed 's/^.*\///'`
[ -z "$rotatepath" ] &&
rotatepath=`echo "$logfile" | sed 's/\([/]*[^/]*\/\)\(.*\)/\1/'` &&
rotatepath=`expr "$rotatepath" : '\(.*\/\)'`
[ -z "$rotatepath" ] && rotatepath="./"
if [ ! -f "$rotatepath" ]; then
if [ ! -d $rotatepath ]; then
if ! mkdir -p $rotatepath; then
logger -s -t "$0[$$]" "Error: Can't create directory $rotatepath" >&2
exit 1
fi
fi
else
logger -s -t "$0[$$]" "Error: $rotatepath is a file" >&2
exit 1
fi
logsize=`ls -l $logfile | awk '{print $5}'`
if [ $logsize -gt $maxlogsize ]; then
iter=$rotatedepth; while [ $iter -gt 0 ]; do
itern=`expr $iter - 1`
if [ -f "$rotatepath/$logfilename.$itern" ]; then
mv -f $rotatepath/$logfilename.$itern $rotatepath/$logfilename.$iter; fi
if [ -f "$rotatepath/$logfilename.$itern.gz" ]; then
mv -f $rotatepath/$logfilename.$itern.gz $rotatepath/$logfilename.$iter.gz; fi
if [ -f "$rotatepath/$logfilename.$itern.bz2" ]; then
mv -f $rotatepath/$logfilename.$itern.bz2 $rotatepath/$logfilename.$iter.bz2; fi
iter=`expr $iter - 1`
done
mv -f $logfile $rotatepath/$logfilename.0
touch $logfile
if [ -n "$cmp" ]; then
iter=$compressdepth; while [ "$iter" -le "$rotatedepth" ]; do
if [ -f "$rotatepath/$logfilename.$iter" ]; then
if [ "$cmp" = "gz" ]; then
if [ ! -f "$rotatepath/$logfilename.$iter.gz" ]; then
gzip -S ".gz" $rotatepath/$logfilename.$iter ||
logger -s -t "$0[$$]" "Warning: compress archive of $logfile failed"
fi
fi
if [ "$cmp" = "bz2" ]; then
if [ ! -f "$rotatepath/$logfilename.$iter.bz2" ]; then
bzip2 -9 $rotatepath/$logfilename.$iter ||
logger -s -t "$0[$$]" "Warning: compress archive of $logfile failed"
fi
fi
fi
iter=`expr $iter + 1`
done
fi
logger -s -t "$0[$$]" "$logfile rotated. Archive are in $rotatepath"
fi