За чистый и ясный код!

Статьи на тему программирования под веб, используя PHP, MySQL, Jquery и многое другое

Логирование ошибок сайта для Kohana.

Январь27

Файл регистрации, журналирование, логирование — все это одно и тоже и сводится к одному — записи различных действия на носитель. Для чего всё это нужно, ой тут много ответов — для протоколирования какой-нибудь процедуры, для контроля поведения кого-то и тд. В общем дело это нужное, и я хотел бы рассказать как я веду логирование ошибок у себя на сайтах написанных с помощью фреймверка Kohana.

В самой Кохане уже есть логирование на уровне ядра фрейма и оно хорошо работает, записывает в папку application/logs данные о логировании (по-дефолту, управляется всё из файла bootstrap.php, строка Kohana::$log->attach(new Kohana_Log_File(APPPATH.’logs’));). Система формирует структуру папок YYYY/MM/DD.php,
где YYYY — год, когда создался файл, MM — месяц (две цифры) и DD.php сам файл с номеров дня месяца.
Файл заполняется по команде:

try
{
	return $this->_write();
}
catch (Exception $e)
{
	// Log & ignore all errors when a write fails
	Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e))->write();

	return FALSE;
}

само содержание файла лога выглядит так:

2010-10-01 17:54:15 --- ERROR: ReflectionException [ -1 ]: Class controller_contact does not exist ~ SYSPATH\classes\kohana\request.php [ 1094 ]
2010-10-01 17:54:37 --- ERROR: ErrorException [ 4 ]: syntax error, unexpected ';', expecting T_STRING or T_VARIABLE or '$' ~ APPPATH\views\main.php [ 5 ]
2010-10-01 17:56:23 --- ERROR: ReflectionException [ -1 ]: Class controller_contact does not exist ~ SYSPATH\classes\kohana\request.php [ 1094 ]
2010-10-01 17:56:33 --- ERROR: ReflectionException [ -1 ]: Class controller_contact does not exist ~ SYSPATH\classes\kohana\request.php [ 1094 ]
2010-10-01 17:59:58 --- ERROR: ReflectionException [ -1 ]: Class controller_contact does not exist ~ SYSPATH\classes\kohana\request.php [ 1094 ]
2010-10-01 18:28:37 --- ERROR: ErrorException [ 1 ]: Class 'Helper_Html' not found ~ APPPATH\views\form_contact.php [ 37 ]
2010-10-01 18:29:14 --- ERROR: ReflectionException [ -1 ]: Class controller_captcha does not exist ~ SYSPATH\classes\kohana\request.php [ 1094 ]
2010-10-01 18:29:22 --- ERROR: ReflectionException [ -1 ]: Class controller_captcha does not exist ~ SYSPATH\classes\kohana\request.php [ 1094 ]
2010-10-01 18:30:45 --- ERROR: ReflectionException [ -1 ]: Class controller_captcha does not exist ~ SYSPATH\classes\kohana\request.php [ 1094 ]
2010-10-01 18:30:49 --- ERROR: ReflectionException [ -1 ]: Class controller_captcha does not exist ~ SYSPATH\classes\kohana\request.php [ 1094 ]

В принципе вся инфа о падении, добавления своих собственных комментариев и т.д. всё будет фиксироваться. Но мне не очень понравилось то кол-во информации которое я мог почерпнуть из этого файла. Например состояние cookie, что за браузер и тд. Пришлось поискать готовые решения. Такое решение было найдено — kohana-log, что мне тут понравилось, что данные доступны по урлу, что в логе сохраняются следующие данные:

  1. Сама ошибка
  2. IP клиента
  3. uri где произошла ошибка
  4. referer
  5. agent — браузер
  6. cookie

По ссылке http://localhost/path/to/log/day, где day — дата за которую хотим просмотреть лог, вида DD.MM.YYYY. Можно посмотреть лог за текущий или любой день не входя по ФТП или SSH, но были конечно и бока — порой не верный парсинг, отсутствие возможности сохранять свои данные в БД (может и глупо, но было требование заказчика). Для более удобного набора ссылки в браузере, да и человека, я оставил её в виде сео чпу, вообще мне нравятся роутинги фреймворков, которые позволяют сделать чпу-ссылки, а не ссылки в виде набора параметров. Также есть еще ссылка, для загрузки лога, в виде чпу http://localhost/path/to/log/download/day (эту ссылку я уже добавил с своей версии).

Более подробно на странице плагина.

Я немного переписал плагин, починил парсинг, добавил возможность загрузки лога к себе на машину и также добавил возможность сохранять данные лога в БД.

Для логирования в файл нужно в bootstrap.php написать следующий код

Kohana::$log->attach(new Log_Writer_File(APPPATH.'logs'));

Для логирования в БД нужно в bootstrap.php написать следующий код

Kohana::$log->attach(new Log_Writer_Database);

Также для БД нужно сделать табличку

CREATE TABLE IF NOT EXISTS `logs` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `level` enum('EMERGENCY','CRITICAL','ERROR','WARNING','NOTICE','INFO','DEBUG') COLLATE utf8_unicode_ci DEFAULT 'INFO',
  `message` varchar(5000) COLLATE utf8_unicode_ci DEFAULT NULL,
  `client` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `uri` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL,
  `referer` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL,
  `agent` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL,
  `cookie` varchar(2000) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Логирование ошибок сайта' AUTO_INCREMENT=1 ;

Пример просмотра лога можно увидеть тут, а скачать исходники моего переделанного модуля логирования тут.

Удачного дебага и профилирования.

Статья просмотренна 445248 раз, зашло посетителей 37153

  

Облако тегов

cli csv dump events form Kohana locale models MySQL mysqldump orm PHP tools trigger validate газ газовый счетчик итоги кеширование переменные

Облако тегов плагина WP Cumulus для WordPress требует для просмотра Flash Player 9 или выше.

Я на твиттере!

  • у твиттера тоже бывают перерывы...

Календарь

Июль 2017
Пн Вт Ср Чт Пт Сб Вс
« Июл    
 12
3456789
10111213141516
17181920212223
24252627282930
31  

Сейчас на сайте