Как сделать ротацию логов
СИНТАКСИС
logrotate [-dv] [-f|—force] [-s|—state файл] файл_конфигурации+
ОПИСАНИЕ
ОПЦИИ
ФАЙЛ КОНФИГУРАЦИИ
Всю необходимую информацию для обращения файлов журналов logrotate извлекает из группы конфигурационных файлов, заданных в командной строке. Каждый файл конфигурации может установить глобальные опции (вместе с тем, локальные значения опций переопределяют глобальные, а последующие определения замещают предыдущие) и определить обрабатываемый файл журнала. Простой конфигурационный файл содержит примерно следующее:
В последнем разделе определены параметры для все файлов, находящихся в /var/log/news. Обращение всех файлов производится ежемесячно. Это предусматривает единые указания для обращения, и в случае возникновения ошибки при обработке больше чем одного файла сжатие файлов журналов не будет произведено.
Далее представлена информация о директивах, которые могут быть указаны в конфигурационном файле logrotate:
Сегодня мы поговорим о том что такое ротация логов, с чем ее едят и насколько она вкусна. Ротация — процесс обновления чего‐то , круговорот чего‐то . Но что такое ротация логов?
Ротация логов — это процесс архивирования логов, удаление старых логов и все из этого вытекающее. Оно нужно для того, чтобы внезапно у вас не забилось все место на HDD/SSD различными логами, ну, а так же для того, чтобы не было слишком много одинаковых и очень больших лог‐файлов . При ротации логов происходит несколько вещей:
Порядок всех этих действий может быть произвольным, и зависит от напрямую от реализации утилиты для ротации логов. В linux‐based системах зачастую используется утилита logrotate которая запускается по умолчанию (покрайней мере в ubuntu) кроном раз в день и делает свою грязную работу. В bsd системах, насколько мне известно, используется newsyslog для той же самой работы, но т.к. freebsd я видел всего несколько раз в жизни — ничего полезного я сказать о ней не могу :).
Logrotate имеет свой конфигурационный файл /etc/logrotate.conf в котором описаны глобальные параметры, а так же, подключаются различные дополнительные конфиги из /etc/logrotate.d в которых описаны действия для различных демонов. Например, конфиг nginx выглядит примерно так:
Конфигурационные файлы logrotate человекопонятные. В частности, в этом конфигурационном файле описываются правила для файлов попадающийх под glob‐шаблон /var/log/nginx/*.log:
- missingok — говорит о том, что если файла нету то все ок
- daily — проводить ротацию ежедневно
- rotate X — хранить X файлов
- compress — сжимать старые файлы
- delaycompress — не сжимать последний лог
- notifempty — не архивировать пустые файлы
- create ACCESS_MODE USER GROUP — с какими правами создавать архивы
- sharedscripts — какая то фишка для prerotate и postrotate:)
- prerotate, postrotate — что сделать перед ротацией и после нее.
Что меня побудило написать эту статью? Написать эту статью я решил потому что обнаружил то, что на моих серверах которые я админю логи apache и nginx внезапно стали помещаться в домашнюю директорию пользователя, и имели различные размеры (от пары мегабайт до нескольких гигов), и конечно же ротация логов не была перенастроена, и так вот логами было съедено приличный объем дискового пространства.
Мораль сей басни такова: работает — не трогай, блядь, и все будет работать отлично! А если хочется потрогать — ССЗБ :)
Что бы избежать заполнения диска старыми логами — необходимо настроить утилиту logrotate .
Основной файл конфигурации — /etc/logrotate.conf .
Для создания настроек отдельных логов — используем директорию /etc/logrotate.d , которая описана как:
Добавим наблюдение за логом /var/log/iptables.log .
Создаём файл /etc/logrotate.d/iptables.conf с таким содержимым:
/var/log/iptables.log rotate 5
missingok
notifempty
compress
size 1M
daily
create 0644 root root
postrotate
service rsyslog restart > /dev/null
endscript
>
- rotate — количество копий старых логов;
- missingok — не писать сообщения в stdout , если файл отсутствует;
- notifempty — не выполнять никаких действий, если файл пустой;
- compress — сжимать gzip ;
- size — размер файла, при достижении которого он будет сжат и сохранён как старый;
- daily — выполнять проверку каждый день;
- create — права доступа и владелец при создании нового файла;
- olddir — перемещать старые логи в указанную директорию;
- postrotate/endscript — действие, выполняемое после ротации логов;
- mail — адрес, на который высылать уведомление о ротации;
Для проверки — выполняем:
Учтите — это действие выполнит обязательную ротацию всех логов, указанных в конфигурации logrotate .
Ротация почтовых логов:
cat /etc/logrotate.d/maillog
/var/log/maillog
daily
missingok
sharedscripts
rotate 10
compress
delaycompress
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
>
Для примера буду описывать ротацию логов nginx. После установки nginx, вы получите следующий конфиг для ротации логов — /etc/logrotate.d/nginx.
Все не указанные явно параметры будут браться из дефолтного конфига /etc/logrotate.conf.
Для того, чтобы защитить сервер от заполнения всего свободного пространства диска логами aceess.log, ротация раз в день не подходит. Тебе за час без напряга смогут забить весь диск логами. Лучше настроить ротацию по достижении определенного размера файла. Для этого вы используете параметр:
И ждете, что по достижении размера файла access.log в десять мегабайт, будет произведена ротация. На самом деле не будет. По-умолчанию, logrotate запускается раз в сутки, поэтому он при всем желании не сможет следить за размером файла и ротировать его чаще, чем раз в сутки.
За его запуск отвечает скрипт в директории /etc/cron.daily/logrotate. Для того, чтобы logrotate мог проверять размер лог файла хотя бы раз в час, скрипт запуска надо перенести в директорию /etc/cron.hourly. А для более частой проверки, добавить его напрямую в cron с нужным интервалом запуска. Например, раз в 5 минут.
Допустим вы все это сделали, но логи все равно не будут ротироваться при достижении заданного размера. Понять, в чем же теперь проблема, не так просто. При запуске logrotate вы не увидите никаких ошибок. Он просто ничего не будет делать. Понять, в чем проблема, можно только при запуске в режиме отладки. Там вы увидите ошибку, если в этот день ротация уже была хотя бы раз.
Смысл тут в том, что logrotate сегодня уже произвел ротацию и создал архив лога с определенным именем и второй раз такой же файл он сделать не может. А маска имени файла при создании настроена в формате %Y%m%d. За эту маску отвечает параметр в /etc/logrotate.conf:
Самый простой вариант — это просто закомментировать этот параметр, тогда все архивы логов будут иметь следующую маску в файлах:
И так далее. Если же вам хочется сохранить исходный формат лога для всех файлов, а для тех, что ротируются по размеру, настроить другую маску имени, используйте дополнительный параметр:
Таким образом, чтобы настроить ротацию лог файла, например, aceess.log, по достижении определенного размера, вам нужно:
- Запускать через cron logrotate с достаточно высокой периодичностью, например раз в час или чаще.
- Настроить маску файла для архива лога, чтобы она была уникальной в каждый момент запуска logrotate.
Вот пример для ротации конфигов nginx или apache по достижении размера лог файла в 10 мегабайт.
Logrotate - это системная утилита, которая управляет автоматической ротацией и сжатием лог-файлов. Если в процессе длительной работы сервера файлы не были ротированы, сжаты и периодически не удалялись, то рано или поздно они могут занять весь доступный объем памяти.
Logrotate устанавливается по умолчанию на сервере и настроена для обработки ротации журналов для всех установленных пакетов и приложений.
Проверка версии Logrotate:
Вывод команды будет следующий:
Стандартная конфигурация Logrotate хранится по двум путям:
- Основной файл конфигурации — /etc/logrotate.conf.
- Для создания настроек отдельных логов — используем директорию /etc/logrotate.d
Рассмотрим конфигурационный файл Logrotate /etc/logrotate.d:
Вывод команды будет таким:
Этот файл содержит конфигурационные блоки для двух разных файлов журнала в каталоге. Оба блока имеют одинаковые опции. Любые параметры, не заданные в этих конфигурационных блоках, наследуют значения по умолчанию или значения, установленные в файле /etc/logrotate.conf.
Основные директивы управления и обработки логов:
- monthly - ротация раз в месяц. Возможные варианты daily, weekly, monthly, size;
- notifempty - не ротировать пустой лог-файл.
- rotate - указывает сколько старых логов нужно хранить, в параметрах передается количество;
- create - указывает, что необходимо создать пустой лог файл после перемещения старого;
- dateext - добавляет дату ротации перед заголовком старого лога;
- compress - указывает, что лог необходимо сжимать;
- delaycompress - не сжимать последний и предпоследний журнал;
- extension - сохранять оригинальный лог файл после ротации, если у него указанное расширение;
- mail - отправлять Email после завершения ротации;
- maxage - выполнять ротацию журналов, если они старше, чем указано;
- missingok - не выдавать ошибки, если лог файла не существует;
- olddir - перемещать старые логи в отдельную папку;
- postrotate/endscript - выполнить произвольные команды после ротации;
- start - номер, с которого будет начата нумерация старых логов;
- size - размер лога, когда он будет перемещен;
Для управления файлами журналов для приложений можно использовать два варианта:
- Создать новый файл конфигурации Logrotate и поместить его в каталог /etc/logrotate.d/. Он будет работать ежедневно, как пользователь root вместе со всеми другими стандартными заданиями LogRotate.
- Создать новый конфигурационный файл и запустить его с настройками LogRotate по умолчанию в Ubuntu.
Создание конфигурации в /etc/logrotate.d/
В качестве примера настроим обновления для сервера, который пишет логи в файлы access.log и error.log, расположенные в каталоге /var/log/example-app/.
Чтобы добавить конфигурацию каталог /etc/logrotate.d/, откройте новый файл:
- create 0640 www-data www-data - данная команда создаст новый пустой файл журнала после ротации с заданными разрешениями (0640), владелец ( www-data) и группы (www-data);
- sharedscripts - эта опция означает, что любые скрипты, добавленные в конфигурацию, выполняются только один раз за запуск после сжатия файлов, а не для каждого отдельного обновленного файла. Поскольку наша конфигурация будет соответствовать двум лог-файлам (access.log и error.log), скрипт, указанный в postrotate, будет запускаться только 1 раз;
- postrotate to endscript - скрипт в этом блоке будет запущен после того, как файл журнала обновится. В примере приложение перезагружается.
После настройки конфигурации в соответствии с требованиями, можно выполнить тестирование с помощью команды:
В результате будет вызвана утилита logrotate, с указанием на стандартный файл конфигурации в режиме отладки.
В консоль будет выводиться информация, о том какие файлы logrotate обрабатывает в данный момент. Стандартная настройка Logrotate будет выполняться один раз в день, включая новую конфигурацию.
После чего, можно выполнить проверку того, что создали:
Создание конфигурации LogRotate
В этом примере мы имеем приложение, которое работает под пользователем testing, генерация журналов, которые хранятся в каталоге /home/testing/logs/. Нам нужно сделать ротацию этих журналов ежечасно, поэтому мы должны установить его за пределами структуры /etc/logrotate.d, представленной в Ubuntu.
Создадим через текстовый редактор конфигурационный файл в нашем каталоге.
Затем вставьте следующую конфигурацию:
Сохраните и закройте файл.
Такая конфигурация будет вращать файлы ежечасно, сжимая и сохраняя двадцать четыре старых журнала и создавая новый файл журнала для замены повернутого.
Необходимо настроить конфигурацию в соответствии с вашим приложением.
Сделаем файл журнала чтобы проверить, что он работает:
Поскольку журналы принадлежат testing нам не нужно использовать sudo. Однако нам нужно указать файл состояния. Этот файл записывает, что logrotate видел и сделал в прошлый раз, так что он знает, что делать при следующем запуске.
Мы попросим Logrotate поместить файл состояния прямо в наш домашний каталог для этого примера. Мы можем указать где угодно, что доступно и удобно:
–verbose распечатает подробную информацию о том, что делает Logrotate. Это первый раз, когда LogRotate видит этот файл журнала, так, насколько это известно, файлу ноль часов, и к нему не должно быть применена ротация.
Если мы посмотрим на файл состояния, мы увидим, что Logrotate записал информацию о запуске:
Logrotate отметил, что он видел журналы, и когда он последний раз рассматривал их вращение. Если запустить эту же команду, один час спустя, журнал будет повернут, как ожидалось.
Если вы хотите заставить LogRotate производить ротацию файла журнала, тогда надо использовать флаг –force:
Далее, нужно настроить задание cron для запуска Logrotate каждый час. Откройте crontab пользователя:
Откроется текстовый файл. Возможно, в файле уже есть некоторые комментарии, объясняющие ожидаемый основной синтаксис.
Переместите курсор на новую пустую строку в конец файла и добавьте следующее:
Читайте также: