Логирование ошибок сайта для Kohana.
Файл регистрации, журналирование, логирование — все это одно и тоже и сводится к одному — записи различных действия на носитель. Для чего всё это нужно, ой тут много ответов — для протоколирования какой-нибудь процедуры, для контроля поведения кого-то и тд. В общем дело это нужное, и я хотел бы рассказать как я веду логирование ошибок у себя на сайтах написанных с помощью фреймверка 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, что мне тут понравилось, что данные доступны по урлу, что в логе сохраняются следующие данные:
- Сама ошибка
- IP клиента
- uri где произошла ошибка
- referer
- agent — браузер
- 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 ;
Пример просмотра лога можно увидеть тут, а скачать исходники моего переделанного модуля логирования тут.
Удачного дебага и профилирования.
Статья просмотренна 726106 раз, зашло посетителей 77118
Каждый день в своей работе (создание сайтов любой сложности) я использую для разработки два основных браузера FireFox (больше) и Goolge Chrome (меньше), но в последнее время, наверное благодаря телефону с ОС Андроид, я начал больше присматриваться к Хрому. И дабы чувствовать себя «как рыба в воде» хотелось чтобы те расширения которые я использую в FireFox-е хотелось бы использовать и тут.
Наверное один и самых ценных инструментов для разработки. Хром конечно содержит по-дефолту свою панель разработчика, но от привычек надо отказываться постепенно. Поживем увидим. Скачать расширение можно по
Расширение для работы с куками (cookie), позволяет как добравлять, так и изменять существующие куки на сайте. Закачать расширение можно
Очень часто необходимо узнать цвет пипеткой или перевести RGB в HEX и наоборот, для этих целей это прекрасное расширение.
Просмотре заголовков страницы. Единственное я не нашел расширение аля
Очень наглядно показывает содержания JSON ответа. Рекомендую для отладки приложений.
Куда без линейки при верстке!
Набор различных примочек для включения/отключения и показ скрытых элементов. Жаль что здесь на работает валидация локальной страницы — очень помогало в ФФ, а также не работает линейка, изменение размера экрана и тд, в общем поставил чтобы было, вдруг починят.
Полезный инструмент, позволяет сделать скрин или ВСЕГО сайта, а не только видимого окна или сделать часть, также подредактировать скрин и получить короткую ссылку для отправки кому-то. Полезно при пояснении где именно что-то не так или куда именно надо нажать.
К разработки сайтов отношения не имеет, но очень помогает что-то показать «криворуким пользователям», включаем у себя хром с расширением и клиент. Клиент запускает расширение у себя, дает вас код, вы запускаете у себя и вводите код, дальше на вашем экране появляется экран «криворукого юзера» и вы можете показать что да как надо делать.