Особенности ротации логов на 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.