Привет всем. Сегодня я поведаю о своей разработке для Rails 3 — MongodbLogger. Начнем по порядку.
Rails приложение по-умолчанию складывает логи запросов в папку logs. Сами по себе логи очень удобная штука — они помогают посмотреть какие запросы идут в ваше приложение, посмотреть trace ошибки и прочее. В них можно дописывать дополнительную информацию. Хотя файловый лог прост и эффективен, но у него есть определенные ограничения: при использовании множество веб-серверова, лог у каждого свой; нет простого доступа. Запись в РСУБД решает вопросы централизации и простого доступа логов, но сразу возникают другие проблемы: схема таблицы не настолько гибка, как может быть структура лога; запись может быть недостаточно быстра; чистка старых логов — задачи на Ваших плечах. И тут на помощь приходит MongoDB.
MongoDB (http://www.mongodb.org/) — документо-ориентированная система управления базами данных с открытым исходным кодом, не требующая описания схемы таблиц. Какие преимущества дает MongoDB для логирования:
- Гибкая схема коллекций документов;
- Асинхронная вставка данных;
- Capped collection (самочистящиеся коллекции — www.mongodb.org/display/DOCS/Capped+Collections);
- Достаточно быстрая запись в сравнении с файлами;
- Индексирование и поиск;
- Анализ данных (MapReduce);
Для использования MongoDB как логера в Rails 3, я создал специальный gem — MongodbLogger. Установка очень проста:
Добавляем в Gemfile
gem "mongodb_logger"
Добавляем в ApplicationController
include MongodbLogger::Base
создаем конфиг для MongoDB; (примеры в github.com/le0pard/mongodb_logger/blob/master/README.md и подробнее в вики — github.com/le0pard/mongodb_logger/wiki/Mongodblogger-settings)
Подключаем Веб (не обязательно), добавляем в config/routes.rb
require 'mongodb_logger/server' mount MongodbLogger::Server.new, :at => "/mongodb"
Все готово. Теперь ваше Rails приложение будет логировать запросы в MongoDB.
Кликабельные скриншоты веба для MongodbLogger:
Также можно искать через Rails console.
Теперь логи не превысят указанный размер (будет происходить чистка старых записей автоматичкски), фильтровать только ошибки.
Удобство также заключается в том, что можно искать по параметрам в запросе. Например, к нам приходит из формы данные типа params[:order_id] = 12. Такие данные можно искать по логу:
collection.find({"controller" => "order", "action"=> "show", "params.order_id" => order_id})
Также можно чуть ли не создавать свой Google Analytic или Airbrake, но такая задача не стоит перед этим gem-ом :) Хотя расширения могут это и сделать.
Официальный сайт: mongodb-logger.catware.org
Исходники: github.com/le0pard/mongodb_logger
Пользуйтесь и присоединяйтесь :)