Как мне регистрировать ошибки и предупреждения в файле?

233

Как включить все ошибки и предупреждения и записать их в файл, но настроить все это внутри скрипта (ничего не меняя в php.ini)?

Я хочу определить имя файла, чтобы все ошибки и предупреждения регистрировались в нем.

Gorep
источник

Ответы:

358

Используйте следующий код:

ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
error_log( "Hello, errors!" );

Затем посмотрите файл:

tail -f /tmp/php-error.log

Или обновите, php.iniкак описано в этой записи блога с 2008 года.

Мужчина
источник
41
ini_setработает только если этот код выполняется. Бесполезно для кода с ошибками разбора, потому что ошибка будет до выполнения кода. Вместо этого запишите эти изменения в php.ini.
13
9
Если вы не можете редактировать php.ini, вы должны быть в состоянии добавить это в .htaccess: php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.log. Смотрите perishablepress.com/…
Матье
1
У меня есть вопрос, как получить файл error.log для создания в моей папке htdocs?
Томми
Я полагаю, вы просто изменили папку, из tmp/php-error.logкоторой когда-либо хотели?
Лука
Это разбивает мой PHP в 5.4.0
Supuhstar
94

Видеть

  • error_log - отправить сообщение об ошибке куда-нибудь

пример

error_log("You messed up!", 3, "/var/tmp/my-errors.log");

Вы можете настроить обработку ошибок с помощью своих собственных обработчиков ошибок, чтобы вызывать эту функцию для вас всякий раз, когда возникает ошибка или предупреждение, или что вам нужно для регистрации. За дополнительной информацией обращайтесь к главе «Обработка ошибок» в руководстве по PHP.

Гордон
источник
42

Просто поместите эти коды в начало вашего файла PHP / index:

error_reporting(E_ALL); // Error/Exception engine, always use E_ALL

ini_set('ignore_repeated_errors', TRUE); // always use TRUE

ini_set('display_errors', FALSE); // Error/Exception display, use FALSE only in production environment or real server. Use TRUE in development environment

ini_set('log_errors', TRUE); // Error/Exception file logging engine.
ini_set('error_log', 'your/path/to/errors.log'); // Logging file path
Юша Алеауб
источник
4
Вот только если вы также хотите , чтобы все ошибки , которые будут отображаться на выходе и / или в браузере, в дополнение к регистрации. display_errorsНИКОГДА не включать на работающем производственном сервере - эта директива предназначена специально для вывода пользователю и не влияет на ведение журнала. php.net/manual/en/…
Аарон Уоллентин
22

добавьте этот код в .htaccess (в качестве альтернативы функции php.ini / ini_set ):

<IfModule mod_php5.c>
php_flag log_errors on 
php_value error_log ./path_to_MY_PHP_ERRORS.log
# php_flag display_errors on 
</IfModule>

* как прокомментировано: это для серверов типа Apache , а не для Nginx или других.

T.Todua
источник
7
Однако это очень специфично для PHP-модуля Apache.
SacredSkull
9

Это моя личная короткая функция

# logging
/*
[2017-03-20 3:35:43] [INFO] [file.php] Here we are
[2017-03-20 3:35:43] [ERROR] [file.php] Not good
[2017-03-20 3:35:43] [DEBUG] [file.php] Regex empty

mylog ('hallo') -> INFO
mylog ('fail', 'e') -> ERROR
mylog ('next', 'd') -> DEBUG
mylog ('next', 'd', 'debug.log') -> DEBUG file debug.log
*/
function mylog($text, $level='i', $file='logs') {
    switch (strtolower($level)) {
        case 'e':
        case 'error':
            $level='ERROR';
            break;
        case 'i':
        case 'info':
            $level='INFO';
            break;
        case 'd':
        case 'debug':
            $level='DEBUG';
            break;
        default:
            $level='INFO';
    }
    error_log(date("[Y-m-d H:i:s]")."\t[".$level."]\t[".basename(__FILE__)."]\t".$text."\n", 3, $file);
}
Юргена
источник
6

Посмотрите на log_errorsопцию конфигурации в php.ini. Кажется, делать то, что вы хотите. Я думаю, что вы можете использовать error_logопцию, чтобы установить свой собственный файл журнала тоже.

Когда log_errorsдиректива установлена On, любые ошибки, сообщаемые PHP, будут записываться в журнал сервера или в файл, указанный с помощью error_log. Вы можете установить эти параметры ini_setтоже, если вам нужно.

(Обратите внимание, что display_errorsдолжен быть отключен в php.ini, если эта опция включена)

Frxstrem
источник
1
Почему должно display_errorsбыть отключено, если вы включаете log_errors? По моему мнению, не имеет смысла. :)
Гвидо Хендрикс
5
Потому что нет необходимости выводить содержимое ошибок на общедоступный сервер, особенно если текст ошибки незаметно записывается в файл.
Шаббироб
3
Ошибки отображения всегда должны быть отключены на рабочем сервере. Не, если регистрация ошибок настроена где-то еще, но всегда. По умолчанию ошибки записываются в журнал ошибок Apache, чего достаточно.
Пихан
1
Отображение ошибок на производстве делает PHP более популярным :)
PeterM
0

Кроме того, вам нужна директива «AllowOverride Options», чтобы это работало. (Apache 2.2.15)

Stéphane
источник