Як я реєструю помилки та попередження у файлі?


233

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

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

Відповіді:


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.
хакре

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якої місця ви хочете?
Лука


94

Побачити

  • error_log - Надіслати повідомлення про помилку кудись

Приклад

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

Ви можете налаштувати обробку помилок за допомогою власних обробників помилок, щоб викликати цю функцію для вас, коли виникає помилка чи попередження або все, що вам потрібно для реєстрації. Для отримання додаткової інформації зверніться до розділу Поводження з помилками в Посібнику PHP


42

Просто покладіть ці коди вгору до свого PHP / індексного файлу:

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 та інших.


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 слід вимкнути, якщо цей параметр увімкнено)


1
Чому слід display_errorsвідключити, якщо ввімкнути цю функцію log_errors? На мою думку це не має сенсу. :)
Гвідо Хендрікс

5
Оскільки немає необхідності виводити вміст помилок громадськості на виробничий сервер, особливо якщо текст помилки дискретно входить у файл.
Шабіроб

3
Помилки відображення завжди повинні бути відключені на виробничому сервері. Не якщо журнал помилок налаштований десь в іншому місці, але завжди. Помилки реєструються до журналу помилок apache за замовчуванням, що досить часто.
Піхан

1
Відображення помилок на виробництві робить PHP популярнішим :)
PeterM

0

Крім того, для цього вам потрібна директива "Дозволити параметри". (Apache 2.2.15)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.