Вики / Логи и аудит
logrotate (ротация логов)
Чтобы логи не съели диск — ротация, сжатие, хранение; проверка конфигов.
Текстовые логи в /var/log (nginx, apache, кастомные) растут и могут забить диск.
logrotate периодически переименовывает, сжимает и удаляет старые логи.
Запускается по systemd-таймеру (logrotate.timer).
Журнал systemd (journalctl) ротируется отдельно (своими лимитами), logrotate его не трогает.
Глобально — /etc/logrotate.conf, по сервисам — /etc/logrotate.d/<service>:
/var/log/myapp/*.log {
daily # как часто (daily/weekly/monthly) — или size 100M
rotate 14 # хранить 14 копий
compress # сжимать старые (.gz)
delaycompress # не сжимать самый свежий ротированный (для дозаписи)
missingok # ок, если лога нет
notifempty # не ротировать пустые
dateext # суффикс датой (file-20260101) вместо .1
create 0640 myapp myapp # создать новый лог с этими правами/владельцем
su myapp myapp # под кем работать (если каталог не root)
sharedscripts # postrotate один раз на все файлы шаблона
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
| Директива | Смысл |
|---|---|
daily/weekly/monthly |
период |
size 100M |
ротация по размеру (вместо/вместе с периодом) |
rotate N |
сколько копий хранить |
compress/delaycompress |
сжимать / отложить сжатие на цикл |
copytruncate |
копировать и обнулить (если служба не умеет переоткрыть лог) |
postrotate…endscript |
команда после ротации (reload службы) |
maxage N |
удалять старше N дней |
postrotate (reload/переоткрытие) или copytruncate нужны, чтобы служба начала
писать в новый файл.
sudo logrotate -d /etc/logrotate.conf # debug/dry-run: что БЫ сделал (ничего не меняет)
sudo logrotate -v /etc/logrotate.conf # verbose-прогон
sudo logrotate -f /etc/logrotate.d/nginx # ФОРСИРОВАТЬ ротацию сейчас
cat /var/lib/logrotate/status # когда что ротировалось последний раз
systemctl status logrotate.timer # активен ли таймер
Лог растёт, ротации нет
- Конфиг в
/etc/logrotate.d/?logrotate -d(dry-run) покажет, попадает ли файл. - Таймер активен?
systemctl status logrotate.timer. - Ошибка в одном конфиге блокирует остальные — смотри вывод
-d/journalctl -u logrotate.
После ротации служба пишет в старый (удалённый) файл
Нет postrotate с reload или copytruncate. Служба держит старый дескриптор —
место не освобождается (см. disk-usage: lsof +L1). Добавь reload или
copytruncate.
«error: skipping … because parent directory has insecure permissions»
logrotate ругается на права/владельца каталога логов. Добавь su user group в блок.
Диск уже забит логами
Срочно: вручную logrotate -f, поджать/удалить старое; затем настроить ротацию и
лимиты (disk-usage).
sudo logrotate -d CONFIG # dry-run (ничего не меняет)
sudo logrotate -f /etc/logrotate.d/nginx # форсировать сейчас
cat /var/lib/logrotate/status # история ротаций
# блок: daily|size / rotate N / compress / postrotate reload (или copytruncate) / su user group
См. также
- journalctl — Логи и аудит
- Место на диске (df, du, inode) — Хранилище и ФС