Привет, %username%
! Логи – наше всё! Это знает каждый нормальный админ. Но что делать если они растут в объёме? Правильно! Настраивать logrotate чтоб он рулил размерами и количеством.
В любой Linux-системе всегда работает множество фоновых процессов и демонов, которые пишут в свои лог-файлы статусную информацию: об ошибках которые обработали, о выполнении каких-то задач. По стандарту все файлы логов должны храниться в директории /var/log/
.
Анализирую логи можно понять что именно не работает и почему произошла ошибка. Есть одна проблема: логи постоянно пишутся в один файл и размер этого файла постоянно растет, поэтому необходимо систематически чистить логи удаляя старые записи, чтобы однажда не кончилось место на сервере из-за огромного размера лог-файла.
Ты можешь чистить логи ручками – поставить себе напоминание, ходить руками на сервер и вручную удалять старые записи из лог-файлов, а можешь навертеть на bash’е скрипт и поставить его в cron. Однако есть вариант сильно проще - утилита logrotate
.
Как работает
Logrotate предназначен для автоматической обработки лог-файлов. Эта утилита может выполнять необходимые действия с лог-файлами в зависимости от конфигурации. Для примера:
- Можно паковать журналы в архив;
- Отправлять на другой сервер когда они достигнут какого-то размера, возраста;
Проверка условий настраивается ежедневно, еженедельно или ежемесячно. Это позволяет создать довольно гибкую схему ротации логов.
Настройка
В большинстве дистрибутивов эта утилита идет “искаропки”, так что дополнительных действий по ее установке не требуется. Но на всякий случай ставится она вот так:
# CentOS
sudo yum install logrotate
# Ubuntu
sudo apt install logrotate
Ключевые настройки logrotate
находятся в файле /etc/logrotate.conf
. Поддерживается подключение доволнительных настроек, которые могут быть размещены в директории /etc/logroate.d/
. Тебе никто не запрещает херачить весь конфиг в один файл, но “не торопись и подумой!”
Для подключения дополнительных конфигов из директории /etc/logrotate.d/
надо всего лишь раскоментировать строчку в основном конфиге /etc/logrotate.conf
:
include /etc/logrotate.d
Обычно по дефолту эта строка уже есть и не закоментирована. Теперь надо разобраться с основными директивами, чтоб научиться писать “правильный” конфиг для ротации своих лог-файлов.
Чтоб указать logrotate
как часто нужно выполнять проверку используются такие директивы:
hourly
– каждый час;daily
– каждый день;weekly
– каждую неделю;monthly
– каждый месяц;yearly
– каждый год;
С частотой проверки всё понятно и просто. Теперь основные директивы управления и обработки лог-файлов:
rotate
- сколько старых логов нужно хранить, в параметрах передается количество (пример:rotate 4
);create
- необходимо создать пустой лог файл после перемещения старого;dateext
- добавляет дату ротации перед заголовком старого лога;compress
- сжимает архивный лог-файл;delaycompress
- не сжимать последний и предпоследний журнал;extension
- сохранять оригинальный лог файл после ротации, если у него указанное расширение;mail
- отправлять Email после завершения ротации;maxage
- выполнять ротацию журналов, если они старше, чем указано;missingok
- не выдавать ошибки, если лог файла не существует;olddir
- перемещать старые логи в отдельную папку;postrotate
/endscript
- выполнить произвольные команды после ротации;start
- номер, с которого будет начата нумерация старых логов;size
- размер лога, когда он будет перемещен;
Кажется это все основные директивы, которыми тебе придется оперировать. Директивы из основного файла /etc/logrotate.conf
конфигурация будут распространяться на все логи если не было отменено их действие. Файл описывающий логи, которые подлежат ротации с помощью logrotate
верхнеуровнево выглядит вот так:
адрес_файла_лога {
директивы
}
Причем адрес_файла_лога
может быть указан по маске как в примере дальше. Давай сделаем конфигурацию для logrotate
которая будет следить за логами Nginx. Создай файл /etc/logrotate.d/nginx
и приведи его к такому виду:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Эти настройки говорят logrotate
, что:
- все файлы из
/var/log/nginx
у которых суффикс (расширение файла).log
- должны быть обработаны ежедневно
- игнорировать ошибку если файл не найден
- хранить последние 14 архивных файлов
- сжимать все кроме последнего и предпоследнего файлов
- не выполнять ротацию если журнал пустой
- создать новый файл с правами
640
владельцемnginx
и группойadm
- выполнить скрипты один раз не зависимо от количества лог-файлов
- сам скрипт, который выполнится после ротации лог-файлов из этого конфига
По аналогии можно настроить ротацию любого лог-файла в системе. А чтобы проверить что ты в конфиге не накосячил и все будет работать так как ты планируешь, надо выполнить вот это:
logrotate -d /etc/logrotate.d/nginx
Подтвержением того, что ежедневная обработка лог-файлов включена будет появление файла /etc/cron.daily/logrotate
с примерно таким содержимым:
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
Итоги
По аналогии с примером выше ты вполне теперь можешь сконфигурить ротацию других лог-файлов, которые “слишком быстро пухнут”.
Подробнее о параметрах logrotate
можно почитать в мануалах тут или тут:
man logrotate
Если тебе надо автоматизировать, то вот тут моя роль jtprogru.logrotate – не забудь бахнуть звездочку в знак благодарности. Поставить роль можно из Ansible Galaxy вот так:
ansible-galaxy install jtprogru.logrotate
На этом всё!
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.