Определение расположения 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_log

Php без сервера (запуск php без веб-сервера (cli))

Возможные проблемы: На некоторых хостингах phpinfo() может быть заблокирован. В этом случае помогает тестовый скрипт с вызовом 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.log

Php s localhost (запуск php сервера с localhost)

Если директива закомментирована (;error_log), используется значение по умолчанию - syslog.

Типичные ошибки: На сервере может быть несколько php.ini (для CLI и для веб). Рекомендуется проверять оба. Команда 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/null

Php mysql поддержка (поддержка mysql в php)

Также помогает команда locate (требуется предварительное обновление базы):

sudo updatedb && locate error_log
Сложности: Файл лога может называться по-другому (php_error.log, debug.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
Возможные проблемы: .user.ini работает только при использовании PHP-FPM; .htaccess может быть отключен настройками Apache (AllowOverride None). В таком случае настройки игнорируются без предупреждения. Рекомендуется проверить эффект через phpinfo().

Как получить путь к логу ошибок программно в PHP скрипте?

В любом PHP файле можно вызвать функцию:

echo ini_get('error_log');

Она вернет строку с путем или пустое значение. Дополнительно проверяется включено ли логирование:

echo (ini_get('log_errors') ? 'On' : 'Off');

Для тестирования записи в лог отправляется сообщение:

error_log('Тест записи в лог');

Затем сообщение ищется в предполагаемом файле.

Типичная ошибка: Функция ini_get() может вернуть пустую строку, если error_log не установлен. В этом случае фактический вывод ошибок может идти через stderr или syslog. Для точного определения места следует проверить настройки веб сервера или использовать тестовую ошибку.

Где искать логи 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

Затем смонтировать том для сохранения на хосте.

Внимание: При использовании официального образа php:fpm логи могут быть в /var/log/php-fpm/error.log. Проверить можно через 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

Логи сохраняются на хосте и не теряются при перезапуске контейнера.

Где находится лог PHP - comments

En
где лог php (php)