Логирование ошибок в CodeIgniter: отключаем вывод ошибок пользователю и записываем ошибки в лог-файл

Логирование ошибок в CodeIgniter: отключаем вывод ошибок пользователю и записываем ошибки в лог-файл

Во время отладки и настройки полезно видеть ошибки, которые выдает фреймворк CodeIgniter на экране. Но в готовых проектах лучше отключить вывод ошибок на экран и настроить запись ошибок в лог-файл. Несколько несложных действий помогут это реализовать.

Реализуем в фреймворке CodeIgniter отключение вывода ошибок на экран и настраиваем их запись в лог-файл. Также внесём в системе CI необходимые изменения, чтобы не показывались SQL-ошибки, но чтобы они логировались.

Хороший тон - в рабочем коде убирать вывод ошибок пользователю и перенаправлять его в лог-файл.

В CodeIgniter для этого необходимо установить следующие настройки:

1. Файл index.php

error_reporting(0);

2. Файл application/config/config.php

/** 
  0 = отключает логирование 
  1 = записывает только сообщения с ошибками 
  2 = добавляются отладочные сообщения 
  3 = добавляются информационные сообщения 
  4 = добавляются все оообщения 
**/ 
$config['log_threshold'] = 1; 
 
/** 
  По умолчанию логи сохраняются в папку system/logs/ 
  Либо, указывается свой путь к папке для лог-файлов. 
  Необходимо проверить права доступа у папки на запись 
**/ 
$config['log_path'] = '';

3. Файл application/config/database.php

/** 
  TRUE - ошибки базы данных отображаются 
  FALSE - ошибки базы данных не отображаются 
**/ 
$db['default']['db_debug'] = FALSE;

После всех этих настроек ошибки перестанут отображаться пользователю и будут записываться в лог-файлы. Все ошибки, кроме ошибок базы данных (SQL запросы)! Т.е. настройка $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);

Дальше следите за логами в папке system/logs и работайте над ошибками.

 

Источник: yershov.com.ua

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (1)     Подпишитесь на RSS комментариев к этой статье.

1 комментарий

#679
Павел говорит:
October 10, 2012 at 04:40 pm
Отлично! Все в одном месте! А то как CI, так сразу сажусь изобретать велосипед с этими ошибками.