Однажды можно обнаружить, что логи веб-сервера разбухают до сотней мегабайт, а то и больше. Было бы странно самостоятельно регулярно их удалять, тем более, если сайтов на сервере больше десятка. Тем более, что хочется старые логи упаковать в архивы. На помощь нам приходит так называемая ротация логов. В Linux для этого есть logrotate. Возможно, он то, как раз вам и нужен. Прочитать о ротации логов можно в статье на OpenNET. Но для меня он не подошёл, и в этой статье я расскажу о другом варианте ротации логов с помощью bash.
Постановка задачи
Необходимо упаковать все логи на веб-сервере, не только самого Apache, но и логи, создаваемые проектами, в архивы. Архивы должны находиться рядом с логами, в имени архивов фигурируют имена логов и дата создания архивов. После создания архивов, логи нужно удалить, а Apache перезапустить. И выполнять это регулярно в автоматическом режиме.
Что для этого понадобится
Ничего, кроме стандартных программ Linux. Будем использовать cron, tar и bash. И какой-нибудь редактор, например, mcedit или nano, кому-то удобнее vim =)
Подразумевается, что мы выполняем все действия из под root. А содержимое веб-сервера (вместе со всеми логами Apache) для простоты изложения расположено в /var/www/. Для вашего случая, возможно, потребуется внести корректировки в скрипты.
Если у вас не Ubuntu, то вместо «service apache2 stop/start» укажите команды, соответствующие вашему дистрибутиву для остановки и запуска веб-сервера соответственно.
Ход работы
1. Создадим скрипт с именем, например, /var/www/clearlogs.sh:
mcedit /var/www/clearlogs.sh
Скопипастим в него следующее:
#!/bin/sh service apache2 stop find /var/www -type f -name "*.log" -exec tar --remove-files -czf '{}'_`date +%d.%m.%y`.tar.gz '{}' \; service apache2 start
Сохраняем.
2. Теперь вызовем редактирование задач планировщика cron:
crontab -e
И добавим в конец задачу для запуска этого скрипта в 12 часов каждого понедельника, не забыв после этого добавить пустую строку:
0 12 * * 1 sh /var/www/clearlogs.sh
Сохраняем и убеждаемся, что задача добавлена:
root@tooogriki:/var/www# crontab -e
crontab: installing new crontab
crontab -l
root@tooogriki:/var/www# crontab -l
0 12 * * 1 sh /var/www/clearlogs.sh
3. Проверим работоспособность, выполнив скрипт:
sh /var/www/clearlogs.sh
И убедившись, что рядом с пустыми логами (в случае Apache) и удалёнными (в остальных случаях) появились архивы имя_лога.ДД.ММ.ГГ.tag.gz.