logging
- David Grudl
- Nette Core | 8254
Integrované je jen logování chyb.
Pokud si potřebuju logovat něco jiného, obvykle si vystačím s
- peci1
- Člen | 60
Ahoj, zrovna jsem se nad chybejicim logovanim taky podivoval. Ja osobne bych ho v Nette klidne videl integrovany… Pokud clovek potrebuje neco jednoduchyho, tak file_put_contents mozna staci, ale co treba logovani do databaze? Inu, napsal jsem si vlastni logger. Je napsany (snad)tak, aby se dal hodit i do distribuce, ale nechavam to na zvazeni vyssich instanci :)
ILogger.php
FileLogger.php
A pak treba do bootstrap.php
A pak uz si vesele muzete volat
Jeste bych podotknul, ze FileLogger vyuziva Nette SafeStream, takze by mel byt bezpecny pri vice zadostech o zapis soucasne (doufam tedy, ze jsem praci se safeStream pochopil dobre).
A na zaver opravdu varuju pred pouzivanim $newerHigher, v podstate se pri kazdem zapisu musi zapsat cely logfile znovu…
Editoval peci1 (14. 10. 2009 0:36)
- kravčo
- Člen | 721
peci1 napsal(a):
Koukal jsem, ze Environment ma __callStatic, ale asi nevim, jak ho pouzit. Zkousel jsem Environment::ILoggger()->logMessage(). Kde delam chybu?
Správne má byť:
A na zaver opravdu varuju pred pouzivanim $newerHigher, v podstate se pri kazdem zapisu musi zapsat cely logfile znovu…
Prečo ho teda implementuješ?
- Filip Procházka
- Moderator | 4668
Protože to má i mnohem lepší řešení, sice delší, ale pamětově
nenáročné
""stačilo by"" (je to jeden z několika jednoduchým postupů):
- vytvoříš nový soubor „…/log/logger(2).txt“ do něj zapíšeš log
- pomocí zápisového módu append tam přepíšeš úplně všechny řádky z prvního souboru načítané pomocí fgets()
- smažeš soubor logger.txt
- přejmenuješ logger(2).txt na logger.txt
btw, bude to chtít zámek vytvořenej pomocí safe_stream :)
- Jakub Šulák
- Člen | 222
jen se vrátím k původní myšlence, zda implementovat do nette:
myslím že by to nebylo špatné, ale jen pod podmínkou, že to bude postaveno
na adaptéru (výběr kam ukladat). ale pak se ptám, má to cenu tedy dávat
vůbec do nette? nebo to nechat na programatorovi.
- Filip Procházka
- Moderator | 4668
jasir napsal(a):
Zeptám se ze zvědavosti – k čemu je dobrý zápis na začátek souboru?
třeba kdysi, když jsem se přisockoval na jeden server tak tam měli logy ze hry zapisované podle data od nejstaršího, a pak když chtěl člověk přes webové rozhraní prohlížet logy tak musel čekat až se celé načtou a že nebyly malé. Ale to je zase otázka implementace že, jaký si to uděláš…
- peci1
- Člen | 60
HosipLan napsal(a):
jasir napsal(a):
Zeptám se ze zvědavosti – k čemu je dobrý zápis na začátek souboru?
třeba kdysi, když jsem se přisockoval na jeden server tak tam měli logy ze hry zapisované podle data od nejstaršího, a pak když chtěl člověk přes webové rozhraní prohlížet logy tak musel čekat až se celé načtou a že nebyly malé. Ale to je zase otázka implementace že, jaký si to uděláš…
Tohle je presne ten duvod, proc jsem to implementoval. Logy s „appendem na zacatek“ jsou v mnoha ohledech (krome vytvareni) praktictejsi
- peci1
- Člen | 60
HosipLan napsal(a):
Protože to má i mnohem lepší řešení, sice delší, ale pamětově nenáročné
""stačilo by"" (je to jeden z několika jednoduchým postupů):
- vytvoříš nový soubor „…/log/logger(2).txt“ do něj zapíšeš log
- pomocí zápisového módu append tam přepíšeš úplně všechny řádky z prvního souboru načítané pomocí fgets()
- smažeš soubor logger.txt
- přejmenuješ logger(2).txt na logger.txt
btw, bude to chtít zámek vytvořenej pomocí safe_stream :)
hmm, o pametove narocnosti jsem zase tolik nepremyslel… nicmene se nezbavis toho, abys na disku zkopiroval cely log z mista A na misto B… to je ta hruza, pred kterou jsem varoval
- Filip Procházka
- Moderator | 4668
každopádně myslím že by nebylo od věci když se log přiblíží určité velikosti vytvořit pro něj další soubor a popřípadě původní zarchivovat pro zmenšení velikosti, jako to dělají unixy se svýmy logy :)
Editoval HosipLan (14. 10. 2009 9:25)
- laada
- Člen | 35
HosipLan napsal(a):
každopádně myslím že by nebylo od věci když se log přiblíží určité velikosti vytvořit pro něj další soubor a popřípadě původní zarchivovat pro zmenšení velikosti, jako to dělají unixy se svýmy logy :)
jo to by bylo pekne, ale v unixech se o to staraji separatni aplikace. Ono kopirovat treba 2GB neni uplne hned a kdyby na to mel uzivatel cekat …
Asi by se to muselo resit nejakym forkem.
- peci1
- Člen | 60
laada napsal(a):
HosipLan napsal(a):
každopádně myslím že by nebylo od věci když se log přiblíží určité velikosti vytvořit pro něj další soubor a popřípadě původní zarchivovat pro zmenšení velikosti, jako to dělají unixy se svýmy logy :)
jo to by bylo pekne, ale v unixech se o to staraji separatni aplikace. Ono kopirovat treba 2GB neni uplne hned a kdyby na to mel uzivatel cekat …
Asi by se to muselo resit nejakym forkem.
Ahoj, myslim, ze je jasne, ze fork neni ta prava cesta. Jak by se pak web testoval na windows? Mam dojem, ze takove veci do Nette nepatri. Ale moznost delat to ve skriptu je taky samozrejme nedobra :)
Programator si to muze osetrit i jinymi zpusoby, napr. registrovat logger se jmenem souboru, kde je treba den ci mesic v nazvu… At si sam zvazi, jak huste logy ma a jestli se mu vyplati radit je bezne a nebo novejsi nahoru.
- kravčo
- Člen | 721
peci1 napsal(a):
Logy s „appendem na zacatek“ jsou v mnoha ohledech (krome vytvareni) praktictejsi
Podstatné je, že pri logovaní určite viac záleží na tom, ako rýchle je vytváranie – to je totiž kritické, keďže aplikácia logujúca udalosti je žiadosťami o zápis do logu popretkávaná… Nie je problém cronom cez noc logy obrátiť, problém by bol, ak by sa stránka načítavala 2 sekundy, kvôli „praktickosti“ logov…
- Filip Procházka
- Moderator | 4668
Viděls někdy logy v *nixech ? já mám třeba kubuntu a ani jeden jediný soubor .log nemá víc jak 2MB a 2MB přesuneš za úplně titěrnej čas, každopádně já si udělám verzi pro databázi, protože potřebuju logovat akce v administraci a na to se texťáky nehodí.
- Panda
- Člen | 569
HosipLan napsal(a):
Viděls někdy logy v *nixech ? já mám třeba kubuntu a ani jeden jediný soubor .log nemá víc jak 2MB a 2MB přesuneš za úplně titěrnej čas, každopádně já si udělám verzi pro databázi, protože potřebuju logovat akce v administraci a na to se texťáky nehodí.
Viděl jsi někdy logy v *nixech na serveru? Na našem firemním má jen maillog za poslední 2 dny 55MB. Logy Apache za den přiberou zhruba 90MB. A to ten server zas tak zatížený není… Mohu Tě ujistit, že na serveru v produkčním prostředí jsi s časem a velikostmi někde úplně jinde.
Každopádně teď přepisuji jednu mojí starší třídu na logování, která toho umí o trošku víc, než zde uveřejněná třída. A logování na začátek souboru naštěstí neumí…
- Panda
- Člen | 569
Jak jsem před chvílí řekl, tak teď činím.
Třída se používá téměř stejně, jako zde uveřejněná, ale je tam několik rozdílů.
Místo parametru $class
používá parametr $level
,
který určuje vážnost logované zprávy. Jako hodnoty se dosazují konstanty
z ILogger
. Metodou setLogLevel()
lze nastavit
minimální vážnost zpráv, která se bude logovat. Ve vývojovém prostředí
se jako výchozí hodnota nastaví ILogger::DEBUG
, v produkčním
ILogger::INFO
. Nastavením na ILogger::NONE
se
logování vypne.
Dalším docela podstatným rozdílem je nastavení masky názvy souboru.
Děje se tak prostřednictvím metody setFilenameMask()
. Tato maska
se při prvním zápisu pro danou instanci prožene funkcí
strftime()
, což umožní pojmenování souborů logů podle
aktuálního času. Výchozí je hodnota log-%Y-%m-%d.log
, každý
den se tedy vytváří nový soubor.
Ještě zajímavější je nastavení něčeho, co jsem nazval
granularity
(zrnitost, nespojitost, lepší název jsem
nevymyslel). Určuje časový interval v sekundách, na jaký se čas při
vytváření souborů zaokrouhluje. Pokud nastavíme masku souboru na
log-%Y-%m-%d-%H-%M.log
, bude se nám každou sekundu vytvářet
nový log. To není moc ideální, proto můžeme nastavit „zrnitost“ –
pokud nastavíme hodnotu na 1800s, tedy půl hodiny, bude se nám soubor s logy
vytvářet každé půl hodiny. Kombinací těchto hodnot lze krásně ovlivnit
členění logů. Jako název se vždy zvolí počátek intervalu, při
zmíněném nastavení se budou vytvářet logy s názvy typu
log-2009-10-14-17-30.log
i v případě, že by první zápis
přišel až 17:55.
Toho také můžete využít pro vytváření logů podle týdnů:
nastavením hodnoty na Tools::WEEK
(604800s) se budou vytvářet
logy každý týden. Názvy budou vždy podle prvního dne týdne, dneska by se
tedy při výchozí masce vytvořil soubor log-2009-10-12.log
(pondělí bylo 12.).
Další nastavení jsou, myslím, celkem jasná.
Pokud máte někdo nějaké připomínky či nápady, tak sem s nimi.
Kód:
Editoval Panda (14. 10. 2009 18:00)
- peci1
- Člen | 60
Krasa, Pando :)
Jeste jsem si ji trochu upravil, aby brala printf-like argumenty.
Taky v ni pouzivas deprecated Environment::isDebugging().
A taky jsem prehazel parametry konstruktoru podle meho nazoru, ktere clovek
potrebuje nejcasteji prepisovat.
Co me zaujalo, je, ze mi prestal fungovat setServiceAlias (resp. ten funguje, ale __callStatic se nezavola – vsechno testuju na PHP 5.2, takze se ani zavolat nema. Jenze proc mi to s mym loggerem fungovalo??? A proc neni v dokumentaci Nette napsano, ze Alias je PHP 5.3 only?)
- Jan Tvrdík
- Nette guru | 2595
peci1 napsal(a):
Co me zaujalo, je, ze mi prestal fungovat setServiceAlias (resp. ten funguje, ale __callStatic se nezavola – vsechno testuju na PHP 5.2, takze se ani zavolat nema. )
Magická metoda __callStatic
je k dispozici až od PHP
5.3. Nette s tím nic neudělá.
- peci1
- Člen | 60
Jan Tvrdík napsal(a):
peci1 napsal(a):
Co me zaujalo, je, ze mi prestal fungovat setServiceAlias (resp. ten funguje, ale __callStatic se nezavola – vsechno testuju na PHP 5.2, takze se ani zavolat nema. )
Magická metoda
__callStatic
je k dispozici až od PHP 5.3. Nette s tím nic neudělá.
No me prave udivuje, ze s mym puvodnim loggerem ten alias fungoval… :-/