Ротация логов atop на CentOS 7 (Virtuozzo): Часть 2

Особенности ротации логов на CentOS 7 в реализации системы от Virtuozzo.

Почему-то в системе CentOS 7 от Virtuozzo оказались какие-то особенности с реализацией ротации логов для atop. Первая заметка про это — https://unix-garage.tk/rotaciya-logov-atop-na-centos7/. Причём в Debian при тех же настройках файла ротации логов у меня проблем не было никаких и в чистой CentOS 7 тоже было всё красиво.

Какие варианты я нашёл ещё, помимо того, что испытал. Оказывается по умолчанию в системе есть готовый скрипт /usr/share/atop/atop.daily. Выгляди он у меня вот так:

#!/bin/sh

LOGOPTS="" # default options
LOGINTERVAL=600 # default interval in seconds
LOGGENERATIONS=28 # default number of days
LOGPATH=/var/log/atop # default log location

# allow administrator to overrule the variables
# defined above
#
DEFAULTSFILE=/etc/sysconfig/atop # possibility to overrule vars

if [ -e "$DEFAULTSFILE" ]
then
. "$DEFAULTSFILE"

# validate overruled variables
# (LOGOPTS and LOGINTERVAL are implicitly by atop)
#
case "$LOGGENERATIONS" in
''|*[!0-9]*)
echo non-numerical value for LOGGENERATIONS >&2
exit 1;;
esac
fi

CURDAY=`date +%Y%m%d`
BINPATH=/usr/bin
PIDFILE=/var/run/atop.pid

# verify if atop still runs for daily logging
#
if [ -e "$PIDFILE" ] && ps -p `cat "$PIDFILE"` | grep 'atop$' > /dev/null
then
kill -USR2 `cat "$PIDFILE"` # final sample and terminate

CNT=0

while ps -p `cat "$PIDFILE"` > /dev/null
do
CNT=$((CNT + 1))

if [ $CNT -gt 5 ]
then
break;
fi

sleep 1
done

rm "$PIDFILE"
fi

# delete logfiles older than N days (configurable)
# start a child shell that activates another child shell in
# the background to avoid a zombie
#
( (sleep 3; find "$LOGPATH" -name 'atop_*' -mtime +"$LOGGENERATIONS" -exec rm {} \;)& )

# activate atop with an interval of S seconds (configurable),
# replacing the current shell
#
echo $$ > $PIDFILE
exec $BINPATH/atop $LOGOPTS -w "$LOGPATH"/atop_"$CURDAY" "$LOGINTERVAL" > "$LOGPATH/daily.log" 2>&1

По легенде этот скрипт надо завернуть в /etc/cron.daily и ротация логов будет работать красиво. Но и этот вариант в моём случае не прокатил (что именно не заработало не помню, к сожалению; логи просто не ротировались как надо или всё равно не было ротации, всё писалось в один файл).


Решение, которое мне помогло. Покажу его в виде скрипта, который я применял к каждому серверу.

#!/bin/bash

cp /usr/lib/systemd/system/atop.service /usr/lib/systemd/system/_atop.service_copy
find="atop_\x24(.*.)"
replace="atop_daily"
sed -i s/$find/$replace/ /usr/lib/systemd/system/atop.service

#-- logrotate for atop
printf "
/var/log/atop/atop_daily {
missingok
daily
delaycompress
dateext
rotate 5
ifempty
nocreate
compress
compresscmd /bin/bzip2
compressext .bz2
postrotate
systemctl restart atop.service
/usr/bin/find /var/log/atop/ -maxdepth 1 -mount -name 'atop_*' -mtime +4 -exec /bin/rm {} \;
endscript
}
" > /etc/logrotate.d/atop

systemctl daemon-reload
systemctl restart atop

Что тут происходит. В файле запуска сервиса я меняю строчку atop_$(date +%%Y%%m%%d) на удобную мне atop_daily. Для чего? Чтобы избавиться от любых конструкций регулярных выражений при формировании файла ротации логов (это описано в первой статье по ссылке в самом начале этой записи). Поменять можно на любое другое удобное название.

Далее формирую файл ротации логов. В нём я оказываю параметр dateext, чтобы при ротации добавлялась дата лога, что будет очень удобно. И ещё один важный тюнинг, к которому я пришёл. Параметры compresscmd /bin/bzip2 и compressext .bz2. Они позволяю выбрать архиватор. Дело в том, что архиватор по умолчанию практически не сжимал логи. В моём случае это было критично, ежедневных логов без сжатия было до 7ГБ (видимо из-за обильного кол-ва виртуальных машин/контейнеров; во всяком случае по наблюдению именно так). Лучше всего сжимал 7z, но почему-то при ротации архив выходил с пустым логом при выборе этого архиватора. Разобраться не успел.

В конце необходимые перезагрузки. Без перезапуска daemon-reload не будут учитываться изменения в файле atop.service.

 

Добавить комментарий