Codeigniter логирование ошибок

В данной статье описано как в фреймворке 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);
Теги:
лог, ошибки
Добавлено: 29 Июня 2018 07:13:18 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...