Error log: примеры (PHP)
Работа с функцией error_log для записи ошибок в PHP
Раздел: Обработка ошибок
error_log(string $message, int $message_type = 0, ?string $destination = null, ?string $additional_headers = null): boolОписание функции error_log
Функция error_log() в PHP отправляет сообщение об ошибке в системный лог, файл или по электронной почте. Это встроенный механизм логирования, часто используемый для отладки приложений, записи нештатных ситуаций или аудита событий.
Аргументы функции
Сигнатура функции: error_log(string $message, int $message_type = 0, ?string $destination = null, ?string $additional_headers = null): bool
- $message: Сообщение для логирования. Обязательный параметр.
- $message_type: Тип отправки сообщения. Принимает значения от 0 до 4:
- 0: Сообщение отправляется в системный лог или в файл, указанный в директории error_log конфигурации PHP.
- 1: Сообщение отправляется на электронный адрес, указанный в $destination. Для этого требуется третий параметр.
- 2: Сообщение отправляется через удаленный отладчик (устарело, практически не используется).
- 3: Сообщение добавляется в конец файла, указанного в $destination.
- 4: Сообщение отправляется напрямую в SAPI логгер.
- $destination: Назначение. Его значение зависит от $message_type (email адрес или путь к файлу).
- $additional_headers: Дополнительные заголовки для email (используется только при $message_type = 1).
Краткие примеры использования
Запись в системный лог
<?php
// Тип 0 - в системный лог (или в файл из php.ini)
error_log("Критическая ошибка в модуле оплаты");
?>// Результат: сообщение появится в syslog (Linux) или Event Viewer (Windows), // либо в файле, заданном директивой error_log в php.ini
Запись в файл
<?php
// Тип 3 - в конкретный файл
$result = error_log("Пользователь 123 вошел в систему\n", 3, "/var/log/myapp.log");
echo $result ? 'Успешно' : 'Ошибка';
?>Успешно // Содержимое файла /var/log/myapp.log: // Пользователь 123 вошел в систему
Отправка email
<?php
// Тип 1 - отправка на email
$to = "admin@site.com";
$subject = "Тема"; // Тема формируется через additional_headers
$headers = "From: webmaster@site.com";
$message = "Проверьте систему.";
error_log($message, 1, $to, "Subject: $subject\r\n$headers");
?>// На почту admin@site.com придет письмо с указанной темой и отправителем.
Отправка в SAPI логгер
<?php
// Тип 4 - напрямую в SAPI логгер (например, в error_log Apache)
error_log("Запрос к API завершен", 4);
?>// Сообщение будет отправлено в логер текущего SAPI (например, Apache error_log).
Похожие функции в PHP
- trigger_error(): Генерирует пользовательскую ошибку/предупреждение/уведомление. Ошибка может быть обработана пользовательским обработчиком, заданным set_error_handler(). Предпочтительнее для информирования о логических ошибках в коде.
- syslog(): Отправляет сообщение в системный журнал. Обеспечивает более тесную интеграцию с системным демоном syslog (уровни логирования: LOG_ERR, LOG_WARNING). Используется, когда требуется стандартизированное логирование на уровне ОС.
- file_put_contents() с флагом FILE_APPEND: Прямая запись в файл. Более гибкая и производительная для простого записи строк в файлы, но без встроенной обработки ошибок логирования.
- Монологи PSR-3 (например, Monolog): Современные, мощные библиотеки логирования. Поддерживают множество обработчиков (handlers), форматировщиков (formatters), каналов (channels). Являются стандартом для крупных приложений и фреймворков (Laravel, Symfony).
Аналоги в других языках
Error log в Python
import logging
logging.basicConfig(filename='/path/to/log.log', level=logging.WARNING)
logging.error('Сообщение об ошибке')# В Python используется модуль logging, который предоставляет # гибкую систему уровней (DEBUG, INFO, WARNING, ERROR, CRITICAL) # и обработчиков.
JavaScript (Node.js)
console.error('Ошибка соединения с БД');
// Или с использованием модуля fs
const fs = require('fs');
fs.appendFileSync('/var/log/app.log', `${new Date().toISOString()} - ERROR\n`);// В Node.js console.error выводит в stderr. Для записи в файл // обычно используют специализированные библиотеки (winston, pino).
Error log в MySQL
INSERT INTO application_logs (level, message, created_at)
VALUES ('ERROR', 'Неверный запрос от пользователя 5', NOW());-- Логирование часто организуют путем записи в специальную таблицу БД, -- что позволяет удобно анализировать данные.
Типичные ошибки
Несуществующий или недоступный для записи файл (тип 3)
<?php
// Пытаемся записать в файл, который не существует в пути
$result = error_log("test", 3, "/non_existent_dir/log.txt");
var_dump($result);
var_dump(error_get_last());
?>bool(false)
array(4) {
["type"]=> int(2)
["message"]=> string(52) "error_log(): Failed to open stream: No such file or directory"
["file"]=> string(43) "/path/to/script.php"
["line"]=> int(3)
}Некорректный email адрес или проблема с отправкой (тип 1)
<?php
// Функция вернет false, если не удалось отправить письмо
// (например, не настроен mail сервер)
$sent = error_log("Важно!", 1, "not-an-email", "Subject: Test");
echo $sent ? 'Отправлено' : 'Не отправлено';
?>Не отправлено
Использование типа 2 (удаленный отладчик)
<?php
// Тип 2 практически не поддерживается и не работает
$result = error_log("test", 2, "localhost:8080");
var_dump($result);
?>bool(false) // Обычно завершается неудачей
Изменения в последних версиях PHP
Начиная с PHP 8.0, параметры $destination и $additional_headers стали необязательными (nullable). Это позволяет явно передавать null, когда эти параметры не требуются.
// До PHP 8.0: error_log("msg", 3); // Вызывало предупреждение
// Начиная с PHP 8.0:
error_log("msg", 3); // Корректно, destination = null
error_log("msg", 1, "email@example.com"); // additional_headers = nullСущественных изменений в поведении функции в последних версиях не было. Основная логика работы остается стабильной.
Расширенные примеры
Логирование с меткой времени и деталями
Пример php
<?php
function my_log($message, $context = []) {
$timestamp = date('Y-m-d H:i:s');
$logMessage = sprintf("[%s] %s", $timestamp, $message);
if (!empty($context)) {
$logMessage .= ' ' . json_encode($context, JSON_UNESCAPED_UNICODE);
}
$logMessage .= PHP_EOL; // Добавляем перевод строки
return error_log($logMessage, 3, __DIR__ . '/application.log');
}
my_log("Попытка входа", ["user_id" => 42, "ip" => "192.168.1.1"]);
?>// Содержимое application.log:
// [2023-10-05 14:30:22] Попытка входа {"user_id":42,"ip":"192.168.1.1"}Логирование в отдельные файлы по уровню
Пример php
<?php
function log_error($msg) { error_log($msg, 3, 'errors.log'); }
function log_warning($msg) { error_log($msg, 3, 'warnings.log'); }
function log_info($msg) { error_log($msg, 3, 'info.log'); }
log_error("Ошибка БД: соединение разорвано");
log_info("Запуск планировщика задач");
?>Обработка ошибок и логирование в catch-блоке
Пример php
<?php
try {
$data = json_decode(file_get_contents('data.json'), true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
error_log("JSON decode error: " . $e->getMessage() . " in " . $e->getFile() . ":" . $e->getLine(), 3, 'json_errors.log');
// Пользователю показываем упрощенное сообщение
echo "Ошибка обработки данных";
}
?>Логирование с ротацией файлов (простой вариант)
Пример php
<?php
$logFile = 'app.log';
// Если файл больше 5 МБ, переименовываем его
if (file_exists($logFile) && filesize($logFile) > 5 * 1024 * 1024) {
rename($logFile, 'app_' . date('Y-m-d_His') . '.log');
}
error_log("Новое событие\n", 3, $logFile);
?>Использование error_log для отладки сложных структур
Пример php
<?php
$complexArray = ['users' => [['id' => 1, 'name' => 'John']], 'meta' => ['page' => 1]];
// Преобразуем массив в читаемую строку для лога
error_log("Debug array: " . print_r($complexArray, true), 3, 'debug.log');
?>// Содержимое debug.log: // Debug array: Array // ( // [users] => Array // ( // [0] => Array // ( // [id] => 1 // [name] => John // ) // ) // [meta] => Array // ( // [page] => 1 // ) // )
PHP error_log function comments
En
Error log Send an error message to the defined error handling routines