Home » Управление логами с помощью Logrotate на Ubuntu 24
Управление логами с помощью Logrotate на Ubuntu 24

Управление логами с помощью 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.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked