Prskavčí blog

Aug 24, 2010

Zend Framework a NoSQL pro ukládání logů ve webových aplikací, díl prvnío CouchDb

Použití databáze pro ukládání logů se používá často pro analýzu logů. Technicky napojit databázi RBMS (MySQL) pomocí Zend_Log_Writer_Db není žádný problém. Ale vidím tu nevýhodu v tom, že musíte mít schema podle toho co ukládáte za logy. Pokud se rozhodnete použít NOSQL databázi (CouchDb, MongoDb) nemusíte se o schema starat.

V tomto článku si napsat vlastní Zend_Log_Writer pro CouchDb a jak si potom lehce zobrazíme příslušné logy. Napíšeme si také jednoduchou map funkci pro view v CouchDb, kterou v aplikaci použijeme.

Nejprve si projedeme jak se používá Zend_Log_Writer_Db, syntaxi najdete v manuálu. Tabulka v db musí mít pevně dané schéma, která namapujete v konfiguraci writeru.

Implementaci vlastního App_Log_Writer_CouchDb provedeme třeba takto:

Není na tom jak vidíte nic složitého, implementuje funkce __constructor, factory a _write funkci a je to.

Samozřejmě je to kus Zend Frameworku, který potrebuje konfiguraci.

Pro správu CouchDb jsem použil vestavěný Futon.

Vytvořil jsem testovací db “test-log” a v ní pohled, který v kódu potom používám. Vytvoříte temporary_view, které potom při ukládání ložíte do příslušného designu a view. U mě to bylo použité logger/log_by_prior.

Toto view potom volá controller, který načítá data pro zobrazení dat z databáze.

Controller obsahuje dvě akce a to vlastní zobrazení v indexAction a metodu, která záznamy vytváří logAction. V logAction je vidět výhoda neexistence schématu, protože jsem si přidal další informace bez potřeby měnit schéma databáze.

Aktualizovanou verzi Phly_CouchDb najdete v mém forku na githubu, celou ukázkovou aplikaci php_couchdb_logger také.

Pro přístup ke CouchDb můžete použít i jiné knihovny, například PHPillow, která vypadá celkem aktualizovaně. Já jsem použil knihovnu, kterou napsal Matthew Weier O’Phinney hlavně proto, že je psaná přímo pro Zend Framework. Má přehledný a dobře napsaný kód, kde jsem si upravil jen to co jsem se potřeboval.

V dalším pokračování si ukážeme jak by se to dělalo v MongoDb.