- Home »

Управление логами с помощью Logrotate на Ubuntu 24
Если ты хоть раз поднимал продакшн-сервер, то знаешь, что логи — это одновременно твой лучший друг и потенциальный враг. Они помогают отлаживать приложения, отслеживать проблемы безопасности и анализировать производительность. Но вот незадача — без должного контроля логи быстро превращаются в пожирателя дискового пространства. И тут на помощь приходит Logrotate — утилита, которая есть в каждой уважающей себя Ubuntu-системе по умолчанию. Сегодня разберём, как заставить её работать на полную катушку в Ubuntu 24, чтобы твои логи всегда были под контролем.
Что такое Logrotate и зачем он нужен
Logrotate — это системная утилита, которая автоматически ротирует, сжимает и удаляет лог-файлы. Представь, что у тебя есть приложение, которое генерирует по 100MB логов в день. Без ротации через месяц ты получишь 3GB файл, который будет неудобно просматривать и который может забить диск. Logrotate решает эту проблему, создавая новые файлы логов и архивируя старые по расписанию.
В Ubuntu 24 Logrotate поставляется из коробки и запускается через systemd timer каждый день. Основная фишка — он работает автоматически, но требует правильной настройки под твои нужды.
Как работает Logrotate
Механизм работы довольно простой:
- Мониторинг — Logrotate проверяет размер файлов логов и время их создания
- Ротация — При соблюдении условий переименовывает текущий лог и создаёт новый
- Сжатие — Архивирует старые файлы с помощью gzip
- Очистка — Удаляет самые старые файлы согласно политике хранения
Основные файлы конфигурации:
/etc/logrotate.conf # Основной конфиг
/etc/logrotate.d/ # Директория с конфигами для отдельных сервисов
/var/lib/logrotate/status # Файл состояния (когда последний раз ротировались логи)
Пошаговая настройка Logrotate
Начнём с проверки текущего состояния системы:
# Проверяем статус службы
sudo systemctl status logrotate.timer
# Смотрим когда последний раз запускался
sudo journalctl -u logrotate.service
# Проверяем основной конфиг
sudo cat /etc/logrotate.conf
Теперь создадим собственную конфигурацию для веб-сервера:
sudo nano /etc/logrotate.d/myapp
Базовая конфигурация будет выглядеть так:
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 www-data www-data
postrotate
systemctl reload nginx
endscript
}
Разберём каждую опцию:
- daily — ротация каждый день (можно weekly, monthly)
- rotate 30 — хранить 30 архивных копий
- compress — сжимать старые файлы
- delaycompress — не сжимать самую последнюю копию (полезно для чтения)
- missingok — не выдавать ошибку, если файл отсутствует
- notifempty — не ротировать пустые файлы
- create — создавать новый файл с указанными правами
- postrotate — команды после ротации
Практические примеры и кейсы
Давай рассмотрим несколько реальных сценариев:
Конфигурация для высоконагруженного веб-сервера
/var/log/nginx/*.log {
hourly
rotate 168
compress
delaycompress
missingok
notifempty
create 0644 www-data adm
size 100M
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
Эта конфигурация подходит для серверов с большим трафиком, где логи растут очень быстро.
Конфигурация для приложения с базой данных
/var/log/postgresql/*.log {
weekly
rotate 52
compress
delaycompress
missingok
notifempty
create 0640 postgres postgres
sharedscripts
postrotate
systemctl reload postgresql
endscript
}
Сравнение различных стратегий ротации
Стратегия | Преимущества | Недостатки | Использование |
---|---|---|---|
По времени (daily) | Предсказуемость, простота | Может создавать пустые файлы | Обычные веб-серверы |
По размеру (size 100M) | Контроль места на диске | Непредсказуемость | Высоконагруженные системы |
Комбинированная | Лучшее из двух миров | Сложность настройки | Продакшн-серверы |
Продвинутые возможности и трюки
Вот несколько малоизвестных фишек, которые могут оказаться полезными:
Условная ротация с проверкой нагрузки
/var/log/app/*.log {
daily
rotate 7
compress
missingok
notifempty
prerotate
if [ $(cat /proc/loadavg | cut -d' ' -f1 | cut -d'.' -f1) -gt 5 ]; then
echo "High load detected, skipping rotation"
exit 1
fi
endscript
}
Интеграция с мониторингом
/var/log/monitoring/*.log {
daily
rotate 30
compress
missingok
notifempty
postrotate
curl -X POST "https://monitoring.example.com/webhook" \
-H "Content-Type: application/json" \
-d '{"event": "log_rotated", "host": "'$(hostname)'"}'
endscript
}
Умная очистка на основе свободного места
/var/log/bulky/*.log {
daily
rotate 10
compress
missingok
notifempty
postrotate
AVAILABLE=$(df /var/log | tail -1 | awk '{print $4}')
if [ $AVAILABLE -lt 1000000 ]; then
find /var/log/bulky -name "*.gz" -mtime +3 -delete
fi
endscript
}
Тестирование и отладка
Перед тем как пустить конфигурацию в продакшн, обязательно протестируй её:
# Тест конфигурации без выполнения
sudo logrotate -d /etc/logrotate.d/myapp
# Принудительная ротация для тестирования
sudo logrotate -f /etc/logrotate.d/myapp
# Проверка всех конфигураций
sudo logrotate -d /etc/logrotate.conf
# Просмотр состояния
sudo cat /var/lib/logrotate/status
Если что-то пошло не так, смотри логи:
sudo journalctl -u logrotate.service -n 50
Альтернативы и сравнение
Хотя Logrotate — стандарт де-факто, есть и другие решения:
- rsyslog с модулем omfile — встроенная ротация в системе логирования
- journalctl — для systemd журналов с параметрами SystemMaxUse
- fluentd/fluent-bit — для централизованного сбора логов
- logstash — часть ELK стека
Но для локальной ротации файлов Logrotate остаётся наиболее надёжным и проверенным решением.
Автоматизация и интеграция
Logrotate отлично интегрируется с системами автоматизации:
Ansible playbook для массовой настройки
- name: Configure logrotate for web servers
copy:
content: |
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 www-data www-data
postrotate
systemctl reload nginx
endscript
}
dest: /etc/logrotate.d/nginx
mode: '0644'
notify: restart logrotate
Мониторинг через Prometheus
Можно создать простой скрипт, который экспортирует метрики ротации:
#!/bin/bash
# logrotate_exporter.sh
echo "# HELP logrotate_last_run_timestamp Last successful logrotate run"
echo "# TYPE logrotate_last_run_timestamp gauge"
LAST_RUN=$(journalctl -u logrotate.service --since="24 hours ago" | grep "logrotate.service: Succeeded" | tail -1 | cut -d' ' -f1-3)
TIMESTAMP=$(date -d "$LAST_RUN" +%s)
echo "logrotate_last_run_timestamp $TIMESTAMP"
Проблемы и их решения
Самые частые проблемы и способы их решения:
- Логи не ротируются — проверь права доступа и синтаксис конфигурации
- Сервис падает после ротации — используй правильные сигналы в postrotate
- Заканчивается место на диске — уменьши количество хранимых копий или увеличь частоту ротации
- Ротация происходит слишком часто — добавь условие size для ограничения по размеру
Производительность и оптимизация
Несколько советов по оптимизации:
- Используй sharedscripts для группы файлов одного сервиса
- Настрой maxage для автоматического удаления старых файлов
- Используй copytruncate для приложений, которые не могут переоткрыть файлы
- Размести логи на отдельном разделе или VPS с быстрыми дисками
Заключение и рекомендации
Logrotate — это мощная и надёжная утилита, которая должна быть настроена на каждом сервере. Для большинства случаев подойдёт простая конфигурация с ежедневной ротацией и сжатием. Но если у тебя высоконагруженный сервер, стоит рассмотреть более продвинутые настройки.
Основные рекомендации:
- Всегда тестируй конфигурацию перед развёртыванием
- Мониторь свободное место на диске
- Используй правильные сигналы для перезагрузки сервисов
- Не забывай про резервное копирование важных логов
- Регулярно проверяй работу ротации
Если планируешь разворачивать серьёзную инфраструктуру, рассмотри аренду выделенного сервера с достаточным объёмом дискового пространства и настрой централизованный сбор логов.
Больше информации о Logrotate можно найти в официальной документации: https://linux.die.net/man/8/logrotate и в репозитории проекта: https://github.com/logrotate/logrotate.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.