На любом сервере логирование является неотъемлемой частью управления и мониторинга. Однако, с течением времени логи могут занимать значительное количество места на диске, что может привести к проблемам с производительностью и нехватке места. Здесь на помощь приходит утилита logrotate. В этой статье мы рассмотрим, как настроить logrotate для эффективного управления логами, с конкретным примером для веб-сервера Nginx.

Что такое logrotate?

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

Основные Принципы Работы

  • Ротация логов: logrotate позволяет разделить логи на несколько файлов, чтобы избежать их чрезмерного разрастания.
  • Сжатие логов: Старые файлы логов можно сжимать для экономии места.
  • Удаление старых логов: logrotate удаляет файлы логов, которые больше не нужны, после достижения определенного возраста или количества файлов.
  • Настройка прав доступа: Можно настроить права доступа для новых файлов логов.

Пример с веб-сервером

Чтобы настроить Nginx на хранение логов в течение месяца, можно использовать механизм ротации логов с помощью logrotate, который автоматически управляет файлами логов, архивирует их и удаляет старые. Вот как это можно сделать:

Настройка конфигурации logrotate для Nginx/Apache2

  1. Откройте или создайте файл конфигурации для ротации логов Nginx. Обычно файл находится по пути sudo nano /etc/logrotate.d/nginx. Если он не существует, создайте его:

  2. Вставьте следующую конфигурацию:

    /var/log/nginx/*.log {
        daily                    # Ротация логов каждый день
        missingok                # Игнорировать, если файл отсутствует
        rotate 30                # Хранить логи за последние 30 дней
        compress                 # Сжимать архивы для экономии места
        delaycompress            # Задержка сжатия до следующего цикла
        notifempty               # Не ротировать пустые файлы
        create 0640 www-data adm # Создавать новые файлы с правами и владельцем
        sharedscripts            # Использовать общие скрипты для всех файлов
         prerotate
                 if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                         run-parts /etc/logrotate.d/httpd-prerotate; \
                 fi \
         endscript
         postrotate
                 invoke-rc.d nginx rotate >/dev/null 2>&1
         endscript
    
    }
    

Сохраняем файл Ctrl+O , Enter, и закрываем Ctrl+X```

Пояснения по конфигурации:

  • daily: Ротация логов будет выполняться ежедневно.
  • rotate 30: Хранить 30 архивов логов (примерно за месяц).
  • compress: Сжимать архивы логов, чтобы сэкономить место на диске.
  • delaycompress: Сжимать лог только со следующей ротацией, чтобы текущий архив оставался несжатым.
  • notifempty: Не ротировать файлы, если они пустые.
  • create 0640 www-data adm: Создавать новые лог-файлы с правами 0640 и владельцем www-data:adm.
  • postrotate: Выполнять команду после ротации. Команда kill -USR1 отправляет сигнал Nginx для перезапуска записи логов.

Проверка настроек logrotate

Чтобы убедиться, что настройка logrotate для Nginx работает корректно, можно выполнить тест:

sudo logrotate -d /etc/logrotate.d/nginx

Флаг -d запустит logrotate в режиме тестирования (dry-run), и вы увидите, что произойдет, но никакие действия на самом деле выполнены не будут.

Применение и мониторинг

  1. Logrotate обычно запускается автоматически через cron. Убедитесь, что cron работает на вашем сервере.

  2. Для немедленного тестирования вы можете запустить logrotate вручную:

    sudo logrotate /etc/logrotate.d/nginx
    
  3. Проверьте каталог /var/log/nginx, чтобы убедиться, что файлы логов архивируются и старые архивы удаляются по мере необходимости.

Эта настройка позволит вам автоматически управлять логами Nginx, чтобы они хранились только в течение последнего месяца, что помогает поддерживать порядок и экономить место на сервере.

Ротация логов для конкретного сайта на примере Apache2

Выше был вариант для сохранения логов в течении 30 дней для всех виртуальных хостов. А теперь сделаем ротацию логов для конкретного сайта. Поскольку выдавались ошибки повторной ротации логов пришлось перенести логи для сайта в отдельный каталог исправив конфиг виртуального хоста.

Создать конфиг sudo nano /etc/logrotate.d/wildserver.ru ротацией в 30 дней

/var/log/apache2/wildserver.ru/wildserver.ru.access.log /var/log/apache2/wildserver.ru/wildserver.ru.error.log {
        daily
        missingok
        rotate 30
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                if invoke-rc.d apache2 status > /dev/null 2>&1; then \
                    invoke-rc.d apache2 reload > /dev/null 2>&1; \
                fi;
        endscript
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                        run-parts /etc/logrotate.d/httpd-prerotate; \
                fi; \
        endscript
}

Сохраняем файл Ctrl+O , Enter, и закрываем Ctrl+X

Тестим на ошибки:

sudo logrotate -d /etc/logrotate.d/
sudo logrotate -d /etc/logrotate.d/wildserver.ru