Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework][ZF] Automatyczne logowanie wszystkich zapytań do bazy
Forum PHP.pl > Forum > PHP > Frameworki
kitol
Witam,

Czy jest możliwe w stosunkowo prosty sposób uruchomienie automatycznego logowania generowanych przez Zend_Db zapytań do bazy?
Najlepiej jakby po każdym wykonanym zapytaniu (bez dopisywania do dodatkowego kodu) wygenerowane zapytanie byłoby zapisywane w logu (Zend_Log).
Nie chcę tego robić "ręcznie" bo zapytań jest dużo.
Wygooglałem sposób z profilerem, ale to jak armata na komara. Poza tym pobieranie danych z profilingu trzeba wykonać w pewnym momencie (po zapytaniach) a w razie problemów, gdy ten kawałek kodu się nie wykona w logu nie pojawią się wszystkie zapytania.

Z pewnych względów odpada logowanie po stronie bazy danych. Logi muszą być tworzone w aplikacji.
IceManSpy
A nie lepiej wykonać podgląd zapytania tak jak opisałem to u siebie na blogu (patrz sygnaturka)?
kitol
Niestety nie, jak napisałem powyżej nie chcę rozwiązania z profilerem bo:
- log ma być do celów dowodowych na produkcji, a nie chcę aby przypadkiem uzytkownicy mieli wgląd do zapytań do bazy przez przeglądarkę.
- uruchomienie profilingu w bazie zwiększa obciążenie bazy. wykonują się dłużej same zapytania, jak i trzeba wykonać dodatkowe aby pobrać profile.

Słowem profiling jest dobry tylko do celów deweloperskich.
tvister
Wydaje mi się że rozwiązanie z profilerem jest jednak dobre ale należy odpowiednio go użyć.
Zbieraj zapytania tylko DML + wywołania proc i zapisuj dopiero gdzieś postdispatch-u lub przy
zamknięciu pętli dispatchera (loopshutdown)
oraz dodatkowo w error kontrolerze sprawdzaj czy wystąpiło exception typu db i w
tym wypadku ręcznie trigeruj zapis logu. Druga sprawa że nie musisz (chyba nie musisz :-p)
logować zapytań na wszystkich modelach być może wystarczy wyszczególnić bardziej priorytetowe.

ps.
Cytat
- log ma być do celów dowodowych na produkcji, a nie chcę aby przypadkiem uzytkownicy mieli wgląd do zapytań do bazy przez przeglądarkę.

Domyślam się żę profiler pracuje w trybie firebug-a, zmień go na Query
kitol
Jednak wolałbym aby wpisy były dodawane do logu po każdym query automatycznie.
W przypadku profilera jest tak, ze najpierw wykonujemy zapytania, a potem pytamy bazę o to jakie zapytania wysłaliśmy (tak jakbyśmy mieli amnezję).
Problem może być w przypadku, gdy stracimy połączenie z bazą i nie zalogujemy odpowiedzi z listą zapytań.
Specyfika tego systemu polega na tym, ze utrata połączenia z bazą może się zdarzyć.
tvister
Nie no z tą amnezją to przesadzasz. Profiler zendowy inaczej pracuje. Chyba że
masz niestandardowy driver db.
Co do utraty połączenia to tak jak pisałem wcześniej, sprawdzenie jaki wyjątek wystąpił i
przymusowy zrzut logów.



kitol
Masz rację, wydawało mi się, że profiling zendowy wymaga uruchomienia profilingu po stronie bazy danych.

Zrobiłem własnego profilera, który powinien logować natchmiast po wykonaniu zapytania.
Co prawda zrzuca on bindowane parametry w oddzielnej tablicy, ale dla mnie to wystarczy:

  1. class App_Db_QueryLogger extends Zend_Db_Profiler {
  2.  
  3. public function queryEnd($queryId) {
  4. parent::queryEnd($queryId);
  5. $profile = $this->getQueryProfile($queryId);
  6.  
  7. $query = $profile->getQuery();
  8. $params = $profile->getQueryParams();
  9.  
  10. foreach ($params as &$p) {
  11. $p = (string) $p;
  12. }
  13. App::getLog()->info($query);
  14. App::getLog()->info(var_export($params,true));
  15. }
  16. }


podłacza się go:
  1. database.params.profiler.enabled = true
  2. database.params.profiler.class = App_Db_QueryLogger
IceManSpy
Cytat(kitol @ 4.10.2011, 08:28:22 ) *
- log ma być do celów dowodowych na produkcji, a nie chcę aby przypadkiem uzytkownicy mieli wgląd do zapytań do bazy przez przeglądarkę.

Wystarczy ustawić profilera dla środowiska deweloperskiego, a w produkcyjnym już nie.

A może do logowania warto użyć klasy Zend_Log ?
KrzysiekWildfire
Kolego, ja mam zrobione tak, że wszystkie zapytania (funkcja fetchAll($select)) przechodzą właśnie przez tą funkcję, i dzięki temu mogę podłączyć to pod Zend_Log. Tylko do tego potrzebne jest zbudowanie takiej logiki od samego początku. Dodatkowo mam uniwersalną funkcję save która także zapisuje do zend log informacje o zmianach w bazie danych (insert, update) i wsadzam to do loga (wraz z IP).
Jeżeli ktoś chce zobaczyć jak to zostało zrobione to proszę info na PW
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.