Skip to content

Логирование

Структура каталогов с логами

Логи сайтов

bash
/var/www/logs/
├─ a-ceramica.ru/ # логи production
  ├─ public/ # логи WordPress
  ├─ wp-content/
  └─ wp-debug.log
  └─ ...
  └─ logs/
     ├─ access.log # обычные HTTP-запросы
     └─ error.log # ошибки и ответы с кодом ошибки
├─ staged.a-ceramica.ru/ # логи staging
  ├─ public/ # логи WordPress
  ├─ wp-content/
  └─ wp-debug.log
  └─ ...
  └─ logs/
     ├─ access.log # обычные HTTP-запросы
     └─ error.log # ошибки и ответы с кодом ошибки
└─ ...

Ротация и сжатие логов

Для файлов access.log и error.log у production (a-ceramica.ru) и у staging (staged.a-ceramica.ru) настроена автоматическая ежедневная ротация с хранением архивов за последние 30 дней (т.е. при ежедневной ротации это 30 архивов). После каждой ротации логи автоматически сжимаются в gzip

Цель ротации — ограничить размер лог-файлов, не допустить переполнения диска и упростить чтение логов за конкретную дату.


Конфигурация logrotate:

Файл конфигурации logrotate для сайтов находится по пути:

bash
/etc/logrotate.d/a-ceramica

Это кастомный конфиг-файл, созданный вручную и автоматически подхватываемый системой, так как logrotate по умолчанию читает все файлы из директории /etc/logrotate.d/


Пример содержимого конфига

В конфиге используется директива su, чтобы logrotate работал от имени www-data, так как директории логов принадлежат этому пользователю и группе

bash
/var/www/a-ceramica.ru/logs/access.log
/var/www/a-ceramica.ru/logs/error.log
/var/www/staged.a-ceramica.ru/logs/access.log
/var/www/staged.a-ceramica.ru/logs/error.log {
    daily # Ротация каждый день
    rotate 30 # Хранить последние 30 архивов
    compress # Сжимать логи после ротации в gzip
    missingok # Не ругаться, если лог отсутствует
    notifempty # Не рутовать пустые файлы
    su www-data www-data # Выполнять ротацию от имени www-data
    create 644 www-data www-data # Создавать новые файлы с нужными правами
}

💡 30 архивов = 30 дней, если ротация выполняется ежедневно.


Примечание по маске \*.log

Изначально планировалось использовать маску \*.log, чтобы автоматически подхватывались все лог-файлы в соответствующих папках, вместо их явного указания:

bash
/var/www/a-ceramica.ru/logs/*.log
/var/www/staged.a-ceramica.ru/logs/*.log

Однако на практике это не сработало — logrotate игнорировал такие записи. Причина в том, что при использовании директивы su и/или при запуске logrotate через cron или systemd, шаблоны вида *.log не обрабатываются — logrotate не может получить список файлов из директории и проигнорирует такую запись. Поэтому необходимо указывать каждый лог-файл явно.


Проверка конфигурации

Чтобы посмотреть содержимое текущего конфига:

bash
cat /etc/logrotate.d/a-ceramica

Проверить конфигурацию без выполнения ротации:

bash
sudo logrotate -d /etc/logrotate.d/a-ceramica

Принудительно выполнить ротацию вручную:

bash
sudo logrotate -f /etc/logrotate.d/a-ceramica

Внутренний ресурс компании