Appearance
Логирование
Структура каталогов с логами
Логи сайтов
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