Codeigniter логирование ошибок
В данной статье описано как в фреймворке CodeIgniter отключить вывод ошибок на экран и настроить запись ошибок в лог-файл. В частности, показано какие изменения необходимо сделать в “движке” CI, чтобы SQL ошибки не отображались, но логировались.
В рабочем коде желательно убирать вывод ошибок пользователю и перенаправлять его в лог-файл.
В CodeIgniter для этого необходимо установить следующие настройки:
1. Файл index.php
1 2 3 4 |
error_reporting(0); |
2. Файл config.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** 0 = отключает логирование 1 = записывает только сообщения с ошибками 2 = добавляются отладочные сообщения 3 = добавляются информационные сообщения 4 = добавляются все оообщения **/ $config['log_threshold'] = 1; /** По умолчанию логи сохраняются в папку system/logs/ Либо, указывается свой путь к папке для лог-файлов. Необходимо проверить права доступа у папки на запись **/ $config['log_path'] = ''; |
3. Файл database.php
1 2 3 4 5 6 7 8 |
/** TRUE - ошибки базы данных отображаются FALSE - ошибки базы данных не отображаются **/ $db['default']['db_debug'] = FALSE; |
Так вот, после всех этих настроек ошибки перестанут отображаться пользователю и будут записываться в лог-файлы. Все, кроме ошибок базы данных! Т.е. настройка $db['default']['db_debug'] = FALSE;
отвечает как за отображение, так и за запись в лог. Если TRUE – ошибка показывается пользователю и записывается в лог. FALSE – ни пользователю, ни в лог.
Или это ошибка, или такая задумка разработчиков CI, но явно неудобный момент.
Его и предлагаю исправить.
Открываем файл /system/database/DB_driver.php и ищем конструкции такого типа:
1 2 3 4 5 6 7 8 |
if ($this->db_debug) { log_message('error', 'Invalid query: '.$sql); return $this->display_error('db_invalid_query'); } |
И исправляем на такую:
1 2 3 4 5 6 7 8 |
log_message('error', 'Invalid query: '.$sql); if ($this->db_debug) { return $this->display_error('db_invalid_query'); } |
Т.е. просто выносим вызов функции log_message из условия if.
Возможно, придется проделать немного больше правок, но суть понятна.
Например, в функции query я выношу из проверочного условия
1 2 3 4 |
log_message('error', 'Query error: '.$error_msg); |
Значит, нужно вынести и $error_msg = $this->_error_message();, чтобы $error_msg была определена.
1 2 3 4 5 |
$error_msg = $this->_error_message(); log_message('error', 'Query error: '.$error_msg); |
Записываемые сообщения об ошибках БД не очень информативны, поэтому удобно добавлять и сам текст sql-запроса, в котором произошла ошибка.
1 2 3 4 |
log_message('error', 'Query error: '.$error_msg.' '.$sql); |
> Открываем файл /system/database/DB_driver.php и ищем конструкции такого типа:
Не очень правильно – править ядро движка. К тому же в CI есть средства надстраивания своего кода над ядром без изменений последнего