Определение расположения PHP логов: полное руководство администратора
В процессе администрирования веб сервера часто возникает необходимость определить расположение файла журнала ошибок PHP (error_log). Это может потребоваться для отладки, аудита или перенастройки логирования. Далее рассмотрены основные методы поиска и настройки путей к логам PHP.
Способы определения и настройки логов PHP
Как узнать путь к логу ошибок PHP с помощью phpinfo?
Самый простой и надежный способ - использовать встроенную функцию phpinfo(). Создается файл phpinfo.php со следующим содержимым:
<?php phpinfo(); ?>Php localhost 8000 (запуск php встроенного сервера на порту 8000)
Этот файл размещается в корне веб сервера. После открытия в браузере находится строка "error_log". В ней указан абсолютный путь к файлу лога. Если значение отсутствует или пусто, лог не настроен и ошибки направляются в syslog или stderr.
Для командной строки можно выполнить:
php -i | grep error_logPhp без сервера (запуск php без веб-сервера (cli))
echo ini_get('error_log');. Также при пустом значении следует проверить директиву log_errors - она должна быть On.Как найти путь к логу, прочитав php.ini?
Файл php.ini содержит настройки PHP. Чтобы определить загруженный php.ini, используется команда:
php --iniгде создать php (где создать php файл)
Вывод покажет путь к файлу конфигурации. Затем можно найти строку error_log:
grep error_log /путь/к/php.iniгде лог php (где находится лог php)
Пример содержимого:
error_log = /var/log/php_errors.logPhp s localhost (запуск php сервера с localhost)
Если директива закомментирована (;error_log), используется значение по умолчанию - syslog.
php --ini показывает для CLI, а для веб надо смотреть через phpinfo(). Если указано syslog, логи попадают в системный журнал. Просмотр через grep 'PHP' /var/log/syslog или journalctl -u php-fpm.Как найти все файлы с именем error_log на сервере?
Иногда лог создается автоматически с именем error_log в директории каждого скрипта. Для поиска всех таких файлов выполняется:
sudo find / -type f -name "error_log" 2>/dev/nullгде php код (где находится php код)
Чтобы сузить область поиска, можно указать конкретные каталоги:
sudo find /var/log /etc /home -name "error_log" 2>/dev/nullPhp mysql поддержка (поддержка mysql в php)
Также помогает команда locate (требуется предварительное обновление базы):
sudo updatedb && locate error_log-name "*php*error*". Если лог очень большой, поиск может занять время.Как задать собственный путь к логу PHP для конкретного сайта?
Для изолированного хранения логов отдельного веб приложения можно использовать файл .user.ini (для PHP-FPM) или .htaccess (для Apache mod_php). В корне сайта создается .user.ini:
error_log = /home/user/logs/php_errors.log
log_errors = OnДля Apache в .htaccess:
php_value error_log /home/user/logs/php_errors.logНеобходимо создать целевую директорию и установить правильные права. Веб сервер (например, www-data) должен иметь право записи.
mkdir -p /home/user/logs
chmod 755 /home/user/logs
chown www-data:www-data /home/user/logsКак получить путь к логу ошибок программно в PHP скрипте?
В любом PHP файле можно вызвать функцию:
echo ini_get('error_log');Она вернет строку с путем или пустое значение. Дополнительно проверяется включено ли логирование:
echo (ini_get('log_errors') ? 'On' : 'Off');Для тестирования записи в лог отправляется сообщение:
error_log('Тест записи в лог');Затем сообщение ищется в предполагаемом файле.
Где искать логи PHP в Docker контейнере?
В контейнерах по умолчанию вывод PHP отправляется в стандартные потоки. Посмотреть логи контейнера можно командой:
docker logs <container_name>Если требуется сохранять логи в файл внутри контейнера, конфигурация PHP должна быть изменена. Например, в Dockerfile можно создать ini файл:
RUN echo "error_log = /var/log/php/php_errors.log" > /usr/local/etc/php/conf.d/logging.iniЗатем смонтировать том для сохранения на хосте.
docker exec <container> php -i | grep error_log.Расширенные примеры работы с логами PHP:
Пример 1. Поиск логов с фильтрацией по размеру и дате
sudo find / -type f \( -name "error_log" -o -name "*php*error*" \) -size +1k -mtime -7 2>/dev/nullРезультат:
/var/log/php7.4-fpm.log
/var/www/html/logs/php_errors.log
Команда ищет файлы логов, измененные за последние 7 дней, размером больше 1 КБ. Исключаются ошибки доступа.
Пример 2. Скрипт для проверки лога и тестовой записи
<?php
$logPath = ini_get('error_log');
if (empty($logPath)) {
echo "Лог не задан. Возможно, используется syslog.\n";
} else {
echo "Путь к логу: " . $logPath . "\n";
if (is_writable(dirname($logPath))) {
echo "Директория доступна для записи. Выполняется тестовая запись.\n";
error_log("Тестовое сообщение от " . date('Y-m-d H:i:s'));
echo "Сообщение записано.\n";
} else {
echo "Директория не доступна для записи. Проверьте права.\n";
}
}
?>Результат (если лог задан):
Путь к логу: /var/log/php-errors.log
Директория доступна для записи. Выполняется тестовая запись.
Сообщение записано.
Скрипт выводит путь к логу, проверяет права на запись и отправляет тестовое сообщение.
Пример 3. Настройка пользовательского лога через .user.ini
# Содержимое .user.ini в корне сайта
error_log = /home/user/php-logs/php_errors.log
log_errors = On
error_reporting = E_ALLСоздание директории и установка прав:
mkdir -p /home/user/php-logs
chmod 755 /home/user/php-logs
chown www-data:www-data /home/user/php-logsПроверка лога после вызова ошибки (например, неопределенная функция):
[22-Nov-2024 10:15:33 UTC] PHP Fatal error: Uncaught Error: Call to undefined function test() in /home/user/www/test.php:2
Пример 4. Использование syslog и чтение через journalctl
# В php.ini
error_log = syslogПросмотр логов за последние 5 минут:
journalctl -u php-fpm --since "5 minutes ago" | grep "PHP"Результат:
Nov 22 10:20:00 server php-fpm[1234]: PHP Warning: Division by zero in /var/www/html/index.php on line 10
Пример 5. Логирование в Docker с монтированием тома
# docker-compose.yml
version: '3'
services:
web:
image: php:8.1-fpm
volumes:
- ./php-logs:/var/log/php
environment:
PHP_INI_SCAN_DIR: /usr/local/etc/php/conf.d/
command: bash -c "echo 'error_log = /var/log/php/php_errors.log' > /usr/local/etc/php/conf.d/logging.ini && php-fpm"Просмотр лога на хосте:
cat ./php-logs/php_errors.logВнутри контейнера:
docker exec -it web cat /var/log/php/php_errors.logЛоги сохраняются на хосте и не теряются при перезапуске контейнера.