Де лежить debug.log у WordPress і як перенести його в безпечне місце
Знайдіть debug.log у wp-content, винесіть його за межі кореня сайту, щоб відвідувачі не могли його завантажити, і полагодьте налаштування WP_DEBUG, через які файл лишається порожнім.
Опубліковано
За замовчуванням WordPress пише журнал налагодження у wp-content/debug.log — абсолютний шлях на диску має вигляд /path/to/your/site/wp-content/debug.log. Файл не існує, доки в нього справді щось не запишуть, і взагалі не заповнюється, якщо у wp-config.php WP_DEBUG не має значення true, а WP_DEBUG_LOG не увімкнено. Це стандартне розташування ще й створює цілком реальну проблему з безпекою, бо на більшості хостингів файл може завантажити будь-хто просто з браузера.
Три константи і що робить кожна
Усі три йдуть у wp-config.php, вище рядка /* That's all, stop editing! Happy blogging. */. Усе, додане нижче цього рядка, виконується вже після завантаження WordPress і не має жодного ефекту.
| Константа | Значення за замовчуванням | Що робить |
|---|---|---|
WP_DEBUG | false | Головний вимикач. Підвищує рівень звітування PHP, щоб показувати повідомлення, попередження та застарілі виклики. Без неї не працює ніщо інше з цього списку. |
WP_DEBUG_LOG | false | Надсилає помилки у файл. true означає wp-content/debug.log. Рядок трактується як шлях до файлу, у який писати. |
WP_DEBUG_DISPLAY | true | Виводить помилки в HTML сторінки, де їх бачить кожен відвідувач. |
Саме із залежністю між ними найчастіше й помиляються. WP_DEBUG_LOG зчитується всередині гілки WP_DEBUG у стартовому коді WordPress. Якщо WP_DEBUG дорівнює false, встановлення WP_DEBUG_LOG у true не дає взагалі нічого — ні файлу, ні помилки, ні попередження. Якщо ви додали WP_DEBUG_LOG, а журнал не з’явився, спершу перевірте WP_DEBUG.
Робоча конфігурація для живого сайту:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );
Якщо WP_DEBUG уже визначено вище у файлі — а зазвичай так і є, зі значенням false, — відредагуйте той наявний рядок, а не додавайте другий define(). Повторне визначення тієї самої константи спричиняє попередження PHP, яке на сайті з увімкненим виводом опиняється просто вгорі сторінки.
Чому WP_DEBUG_DISPLAY має бути false на робочому сайті
З увімкненим виводом помилки PHP друкуються прямо у HTML-відповідь. Одного повідомлення про застарілий виклик із шаблону досить, щоб показати кожному відвідувачу абсолютний шлях на вашому сервері. Помилка бази даних покаже назви таблиць і фрагменти запитів. Гірше того, вивід, який з’являється до надсилання заголовків, ламає перенаправлення, ламає відповіді REST і AJAX, що очікують чистий JSON, і може дати той самий білий екран, у якому потім звинувачують плагін.
Одна тонкість, яку варто знати: встановити WP_DEBUG_DISPLAY у null — це не те саме, що false. null каже WordPress не чіпати налаштування display_errors у PHP і успадкувати те, що налаштовано на сервері. false активно вимикає вивід. На робочому сайті використовуйте false і додайте наведений вище рядок з ini_set як подвійну страховку, бо плагін може повернути display_errors пізніше під час запиту.
Стандартне розташування доступне ззовні
wp-content/debug.log лежить усередині кореня сайту. Ніщо у стандартній установці WordPress не блокує прямі запити до нього. На типовій конфігурації Apache чи nginx адреса https://yoursite.com/wp-content/debug.log повертає файл звичайним текстом. Журнали налагодження містять абсолютні шляхи на сервері, внутрішні деталі плагінів і шаблонів, помилки бази даних із реальним текстом запитів, а іноді й значення, передані у функції, що збоять. Це безкоштовна розвідка для кожного, хто вгадає URL, — і одна з перших адрес, які пробують автоматичні сканери.
Із цим можна впоратися двома способами. Кращий — перенести журнал.
Перенесення журналу через шлях
Починаючи з WordPress 5.1, WP_DEBUG_LOG приймає рядок зі шляхом до файлу замість булевого значення. Вкажіть місце за межами кореня документів:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', '/home/youruser/logs/wp-errors.log' );
define( 'WP_DEBUG_DISPLAY', false );
Для цього шляху діють три правила. Використовуйте абсолютний шлях — відносний розв’язується відносно робочої теки PHP, яка змінюється від запиту до запиту й від сервера до сервера, тож ви просто загубите файл. Тека вже має існувати: PHP її не створить, а якщо не зможе відкрити файл — мовчки нічого не зробить. І тека має бути доступною для запису користувачеві PHP, який на спільному хостингу не збігається з обліковим записом, під яким ви заходите через SFTP.
Якщо хостинг замикає вас у корені сайту і писати вище просто нікуди, залиште стандартний шлях і натомість заблокуйте доступ на рівні сервера. Для Apache:
<Files "debug.log">
Require all denied
</Files>
Це має йти у файл .htaccess усередині wp-content, а не в кореневий: WordPress переписує кореневий .htaccess, коли ви зберігаєте постійні посилання, і може стерти ваше доповнення. На nginx .htaccess не робить нічого взагалі — там потрібен блок location у конфігурації сервера, а на керованому хостингу це зазвичай означає звернення до підтримки.
Будьте чесні щодо того, що дає блокування: файл усе одно лежить на диску в теці, яку віддає веб-сервер. Помилка з обходом шляху в будь-якому плагіні дозволить його прочитати. Винесення за межі кореня сайту — надійніше рішення.
Як читати файл і стежити за ним
Через SSH можна дивитися журнал наживо, поки ви відтворюєте помилку:
tail -f wp-content/debug.log
Відтворіть помилку в іншій вкладці — і нові рядки з’являтимуться в міру запису. Щоб побачити лише те, що сталося нещодавно, або відфільтрувати за одним плагіном:
tail -n 100 wp-content/debug.log
grep -i 'plugin-slug' wp-content/debug.log | tail -n 50
PHP дописує в кінець файлу, тому читайте знизу вгору. Кожен запис має мітку часу в UTC, яка не збігатиметься з часовим поясом, налаштованим у WordPress, — не дайте цьому ввести вас в оману, що ви дивитеся на старі записи.
За допомогою WP-CLI константи можна перемикати без ручного редагування файлу:
wp config set WP_DEBUG true --raw
wp config set WP_DEBUG_LOG true --raw
wp config set WP_DEBUG_DISPLAY false --raw
Прапорець --raw тут принциповий: без нього значення запишеться як рядок "true", а не як булеве значення. Для варіанта зі шляхом навпаки — приберіть --raw, щоб значення записалося як рядок у лапках.
Немає SSH? Завантажте файл через SFTP або відкрийте у файловому менеджері хостингу. Уникайте плагінів, які показують журнал усередині wp-admin, якщо не довіряєте їм цілком: ви даєте плагіну доступ на читання файлу, повного внутрішніх даних сервера.
Якщо хочете отримати точний блок для wp-config під ваше налаштування, разом із безпечним шляхом за межами кореня та відповідним правилом для сервера, генератор журналу налагодження WordPress збудує його за вас.
Вимкніть журналювання, коли закінчите
Ніщо в ядрі WordPress не ротує і не обрізає debug.log. На сайті, який видає повідомлення при кожному завантаженні сторінки, файл росте безмежно і може заповнити диск — а це кладе сайт значно жорсткіше за баг, який ви шукали. Увімкніть журналювання, відтворіть проблему, прочитайте журнал і поверніть WP_DEBUG у false.
Щоб очистити файл, не видаляючи його:
: > wp-content/debug.log
Коли журнал лишається порожнім
Пройдіться по цьому списку в такому порядку. WP_DEBUG має значення false — найпоширеніша причина, яка мовчки вимикає все інше. Константа стоїть нижче рядка про припинення редагування у wp-config.php. Права доступу — PHP не може писати у wp-content або у вказану вами власну теку. Фатальна помилка ще до завершення завантаження wp-config, наприклад синтаксична помилка в самому файлі конфігурації, стається надто рано, щоб журналювання WordPress її перехопило: такі помилки йдуть у власний журнал помилок PHP на сервері. Хостинг перевизначає налаштування — деякі керовані платформи жорстко задають параметр error_log у PHP або направляють журнали у власну панель, і тоді ваші константи виставлені правильно, а вивід просто в іншому місці. Перевірте переглядач журналів хостингу, перш ніж вирішувати, що ваша конфігурація зламана.
FAQ
Питання
Де знаходиться журнал налагодження WordPress?
За замовчуванням це wp-content/debug.log, тобто файл лежить просто всередині теки wp-content. WordPress створює його лише тоді, коли справді щось записує в журнал, тож порожня тека wp-content не означає, що журналювання зламане. Якщо константі WP_DEBUG_LOG передали шлях до файлу замість true, журнал пишеться саме за тим шляхом.
Чому у wp-content немає файлу debug.log?
Три поширені причини. WP_DEBUG має значення false, тож WordPress взагалі не вмикає журналювання, хай яким буде WP_DEBUG_LOG. Нічого ще не збоїло, тому файл не створено. Або PHP не може писати у wp-content через права доступу. Спершу перевірте константи, потім права.
Чи може будь-хто завантажити мій debug.log із WordPress?
Зазвичай так. Файл wp-content/debug.log лежить усередині кореня сайту, і жодні правила доступу його не захищають, тож запит браузера до цієї адреси часто повертає файл. Журнали налагодження регулярно містять абсолютні шляхи на сервері, помилки бази даних і фрагменти запитів. Винесіть журнал за межі кореня сайту або заблокуйте доступ у конфігурації сервера.
Чим WP_DEBUG_LOG відрізняється від WP_DEBUG_DISPLAY?
WP_DEBUG_LOG записує помилки у файл. WP_DEBUG_DISPLAY виводить їх у HTML сторінки, де їх бачать відвідувачі. На робочому сайті журналювання має бути увімкненим, а вивід — вимкненим. Обидві константи повністю ігноруються, якщо WP_DEBUG не має значення true, і саме цей крок пропускають найчастіше.
Як прочитати журнал налагодження WordPress?
Через SSH запустіть tail -f для шляху до журналу, щоб бачити нові записи наживо, поки відтворюєте проблему. Без SSH завантажте файл через SFTP або відкрийте його у файловому менеджері хостингу. Читайте знизу вгору, бо PHP дописує найновіші записи в кінець файлу.
Чи сповільнює WP_DEBUG роботу живого сайту?
Трохи так, але більший ризик — диск. Докладне журналювання на завантаженому сайті може роздути debug.log до гігабайтів і заповнити диск, а це кладе сайт. Увімкніть журналювання, відтворіть помилку, прочитайте журнал і вимкніть його назад. Ніщо в ядрі WordPress не ротує і не обрізає цей файл за вас.