Pull to refresh

Побеждаем delaycompress в logrotate

Reading time2 min
Views9.3K
Notice: этот пост — скорее для начинающих сисадминов, опытные смогут дойти до этого сами.
Статья описывает настройку logrotate в Debian 5

Опция «delaycompress» в logrotate используется для отложенной архивации логов (во время следующей ротации).
Опция создана для программ, которые не могут закрыть логи сразу, что делает невозможной архивацию во время работы logrotate. Info: «copytruncate» не помогает. Проверено.
В общем-то борьбу с этим ограничением меня заставил вести тот факт, что на некоторых серверах (а точнее — на VPS) доступно ограниченное количество дискового пространства, а логи, тем не менее, занимают много места.
При использовании «delaycompress» к концу каждого дня у нас хранится уже 2 лога большого объема, вместо одного. В моем случае — это лишние ~200-300MB, что для сервера с ограниченными ресурсами ощутимо.
Итак, как же заставить logrotate архивировать логи сразу?


Для исправления ситуации будем использовать секцию «postrotate… endscript» в конфиге ротации. В эту секцию можно записать пользовательский shell-скрипт, который и выполнит необходимые действия.
В общем случае после системного скрипта достаточно дописать в конфиг «gzip /путь/до/лога.1» — и задача решена.
Вместо 1 подставляем то, что у вас описано в секции «start». 1 — по умолчанию.
Однако я привык использовать опцию dateext — она позволяет добавить текущую дату к имени ротируемого лога. Удобно для поиска по логам. Ну и кроме того, логи, скажем, nginx'а для разых хостов у меня лежат в директориях ниже document_root на одном уровне. В таком случае, задача усложняется.
Чтобы не быть голословным, приведу пример своего конфига для logrotate, где описана ротация логов nginx.

/www-data/*/log/nginx_*.log {
daily
missingok
rotate 30
compress
delaycompress
dateext
create 600 www-data www-data
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
for i in `find /www-data/*/log/*.log -type f`; do
if [ -e $i-`date +%Y%m%d` ]; then
gzip $i-`date +%Y%m%d`;
chown www-data:www-data $i-`date +%Y%m%d`.gz;
chmod 0600 $i-`date +%Y%m%d`.gz;
fi;
done;
endscript
}


В секции postrotate описываем все пути до логов, проверяем наличие несжатого лог-файла, и если он есть — сжимаем и выставляем ему необходимые права.
В общем-то всё.
Важное замечание: комментарии # в секции postrotate не работают — вызывают ошибку. Будьте внимательны.

Tags:
Hubs:
Total votes 4: ↑4 and ↓0+4
Comments0

Articles