☰
WORDPRESS / PRACTICE

Безопасное логирование ошибок WordPress в production

Безопасное логирование ошибок WordPress в production

При поиске критической ошибки на рабочем сайте WordPress важно видеть технические детали, но не показывать их посетителям. Stack trace, абсолютные пути к файлам, имена таблиц, SQL-запросы и служебные сообщения могут помочь злоумышленнику понять структуру сайта.

Для production безопаснее временно включить запись ошибок в лог и отключить их вывод в браузере. После диагностики debug-режим нужно отключить, а сам лог — защитить или удалить.

Почему нельзя включать показ ошибок на рабочем сайте

Настройка `WP_DEBUG_DISPLAY` отвечает за показ сообщений PHP и WordPress в ответе страницы. Если она включена, на сайте могут появиться предупреждения, пути к файлам темы или плагинов, имена функций, фрагменты SQL и другие внутренние данные.

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

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

  • Не используйте `WP_DEBUG_DISPLAY` со значением `true` на публичном сайте.
  • Не отправляйте пользователям полные stack trace и тексты SQL-ошибок.
  • Не оставляйте подробное логирование включенным без контроля размера файла и доступа к нему.

Как включить логирование без вывода ошибок

Откройте `wp-config.php` и добавьте настройки перед строкой `That's all, stop editing! Happy publishing.` или ее локализованным аналогом. Важно не создавать дубликаты констант: если они уже есть в файле, измените существующие значения вместо добавления новых строк ниже.

Базовая конфигурация для временной диагностики выглядит так:

  • `WP_DEBUG` включает режим диагностики WordPress.
  • `WP_DEBUG_LOG` записывает сообщения в файл лога.
  • `WP_DEBUG_DISPLAY` запрещает показ диагностических сообщений в браузере.
  • `display_errors` дополнительно отключается на уровне PHP для текущего запроса.
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors', 0);

Куда записывается лог

При стандартной конфигурации WordPress записывает диагностические сообщения в `wp-content/debug.log`. В некоторых конфигурациях `WP_DEBUG_LOG` можно заменить путем к другому файлу, например в отдельном каталоге для служебных логов. Такой путь должен соответствовать правам файловой системы и настройкам хостинга.

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

Как проверить проблему и прочитать debug.log

После сохранения `wp-config.php` воспроизведите ошибку тем же способом, которым ее видит пользователь: откройте нужную страницу, отправьте форму или выполните проблемное действие в админпанели. Затем проверьте, появилась ли новая запись в лог-файле.

Для просмотра последних строк на сервере Linux можно использовать:

  • Ищите время события, имя файла, номер строки и компонент, вызвавший сообщение.
  • Сравнивайте записи до и после конкретного действия, чтобы отделить актуальную ошибку от старых сообщений.
  • Проверяйте не только `Fatal error`, но и `Warning`, `Notice`, `Deprecated`, а также сообщения об ошибках базы данных.
  • Если файл не обновляется, проверьте фактический путь, права на запись и журналы PHP-FPM, веб-сервера или хостинга.
tail -f wp-content/debug.log

Что именно анализировать в записи

Обратите внимание на компонент, упомянутый в пути: плагин, тему, собственный код или ядро WordPress. Номер строки помогает найти место ошибки, но не всегда указывает на настоящую причину: проблема может возникнуть из-за несовместимых версий PHP или плагинов либо некорректных данных.

Не редактируйте код без резервной копии и не вносите непроверенные изменения в production, основываясь на одной строке лога. По возможности сначала воспроизведите проблему на staging-среде.

Как защитить файл с ошибками

Файл `wp-content/debug.log` часто находится в каталоге, доступном через веб-сервер. Если сервер отдает его по прямому URL, любой пользователь может скачать технические записи. В логах иногда оказываются email-адреса, идентификаторы пользователей, фрагменты SQL, токены или данные запросов.

Лучший вариант — хранить production-лог за пределами публичного web root, если это поддерживается вашей конфигурацией. Если файл должен оставаться в `wp-content`, ограничьте доступ на уровне веб-сервера и проверьте защиту отдельным запросом в приватном окне браузера.

  • Для Apache используйте правило запрета доступа к конкретному файлу или каталогу в соответствии с конфигурацией сервера.
  • Для Nginx добавьте отдельное правило `location`, которое запрещает доступ к `debug.log`.
  • Не полагайтесь только на скрытие URL или нестандартное имя файла.
  • Права файловой системы должны разрешать запись пользователю веб-сервера, но не делать файл доступным всем пользователям системы.
  • После настройки проверьте доступ и по HTTP, и напрямую через SSH.

Ротация, размер и конфиденциальность логов

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

Во время анализа относитесь к логу как к конфиденциальным техническим данным. Не публикуйте его полностью в чатах или тикетах. Перед передачей разработчику удалите пароли, токены, cookie, email-адреса, IP-адреса и другие персональные данные.

Если в коде плагина или темы данные вручную записываются через `error_log()`, убедитесь, что в лог не попадают пароли, API-ключи, полные тела запросов или платежная информация. Логирование WordPress не делает такие данные безопасными автоматически.

  • Определите максимальный размер файла и количество архивных копий.
  • Ограничьте доступ к архивам так же, как и к текущему логу.
  • Удаляйте старые копии в соответствии с внутренней политикой хранения данных.
  • Следите за свободным местом на диске после включения диагностики.

Как отключить debug-режим после диагностики

Когда причина ошибки найдена и проверена, верните production-конфигурацию. Обычно это означает отключение всех четырех настроек или удаление временных строк из `wp-config.php`.

  • Убедитесь, что `WP_DEBUG` имеет значение `false`.
  • Отключите `WP_DEBUG_LOG`, если постоянное логирование не требуется вашей системе мониторинга.
  • Оставьте `WP_DEBUG_DISPLAY` отключенным в production.
  • Проверьте сайт в браузере и просмотрите журналы PHP или веб-сервера после изменения.
  • Безопасно удалите или заархивируйте старый `debug.log`, если он больше не нужен.
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors', 0);

Если ошибка нужна для долгосрочного мониторинга

Для постоянного контроля лучше использовать журналы PHP, веб-сервера или специализированную систему мониторинга с контролем доступа, фильтрацией и ротацией. Не стоит оставлять подробный debug-режим WordPress включенным только потому, что на сайте время от времени возникают ошибки.

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

Частые вопросы

Увидят ли посетители ошибки, если `WP_DEBUG` включен, а `WP_DEBUG_DISPLAY` отключен?

В стандартной конфигурации WordPress диагностические сообщения будут записываться в лог, но не будут показываться в HTML-ответе. Дополнительное отключение `display_errors` снижает риск вывода PHP-ошибок, однако после изменения нужно проверить сайт и настройки сервера.

Почему `wp-content/debug.log` не создается или не обновляется?

Проверьте, находятся ли константы в правильном месте и не объявлены ли повторно, воспроизводится ли событие, а также имеет ли пользователь веб-сервера право на запись. Сообщения также могут попадать в журнал PHP-FPM, веб-сервера или панели хостинга.

Безопасно ли оставить `WP_DEBUG_LOG` включенным после исправления?

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

Можно ли просто удалить `debug.log`?

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

Вывод

Безопасная диагностика WordPress в production — это сочетание трех действий: записывать ошибки в контролируемый лог, не показывать технические детали посетителям и ограничивать доступ к самому файлу.

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

← Все материалы WordPress