вторник, 22 октября 2013 г.

HTTP сервис для записи событий в базу данных СouchDb

Когда было отправлено письмо? Кто последним авторизовался в админке? Какая проблема вызвала ошибку 500 веб сервера? Знать ответ на эти вопросы - известная разработчикам задача и каждый раз она решается весьма похоже. Мне кажется, что проблема достойна окончательного решения в виде отдельного сервиса, чтобы не плодить сущности больше необходимого. В этой заметке я хочу представить новый проект https://github.com/Magomogo/couchdb-logger-service для журналирования событий, а заодно рассмотреть какие решения мы уже используем.

Реакция на ошибки

Хорошей практикой является установка обработчика исключений:

set_exception_handler(function (Exception $e) { /* react here /* });

А также хорошо бы и ошибки конвертировать в исключения:

set_error_handler(
    function ($errno, $errstr, $errfile, $errline )
    {
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
);

Ну а для того, чтобы ловить фатальные ошибки, которые наш любимый PHP любит выплёвывать прямо в лицо пользователю, можно использовать трюк с register_shutdown_function():

register_shutdown_function(
    function ()
    {
        $lastError = error_get_last();
        if (!is_null($lastError) && ($lastError['type'] === E_ERROR)) {
            // something terrible happens
        }
    }
);

И вот после того, как все блохи отловлены, необходимо как-то на них отреагировать: записать в файл, отправить письмом или SMS сообщением, в зависимости от логики приложения и важности проблемы.

Запись событий

Среди готовых решений я рекомендую Monolog: https://github.com/Seldaek/monolog, он умеет по-разному записывать сообщения в зависимости от важности: в файлы, письмом, в веб сервисы, базы данных и много куда еще. От разработчика требуется только правильно сконфигурировать каналы.

Если вы используете Silex, то Monolog легко подключить, есть готовый провайдер сервиса. А в простом случае в Silex можно зарегистрировать свои обработчики исключений:

$app->error(function (Exception $e, $code) {/* handle here */});

Кстати, вам вряд ли хочется знать об ошибках 404-not found, поэтому просто обработайте их отдельным обработчиком с наивысшим приоритетом:

$app->error(
    function (NotFoundHttpException $ex, $code) { /* show 'page not found' */ },
    100 // ultimate!
);

CouchDB logger

Логгер https://github.com/Magomogo/couchdb-logger-service можно использовать для регистрации событий. Он является чистым couchdb приложением, то есть не требует особенных зависимостей, кроме couchdb и nodejs (последний только для развертывания).

После установки логгер предоставляет веб-интерфейс для доступа к сохраненным данным по адресу http://127.0.0.1:5984/logger-application/_design/main/_rewrite/

Добавление записей осуществляется HTTP POST запросом на адрес
http://127.0.0.1:5984/logger-application/_design/main/_rewrite/new

Для использования с PHP написаны утилиты: https://github.com/Magomogo/couchdb-logger-utils. Там можно найти провайдер сервиса обработки ошибок SilexExceptionLoggerProvider и MonologHandler, для более прицельной работы.

Подключайте композером:

"require": {
    "magomogo/couchdb-logger-utils": "dev-master"
}

Contribution

Приглашаю разработчиков к совместной работе для развития сервиса, пулл реквесты приветствуются!

2 комментария:

  1. Отличная работа, спасибо! А что автор порекомендует для качественного отлова ошибок в браузере и под Node.js?

    ОтветитьУдалить