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