Autor wpisu: Vokiel, dodany: 21.09.2009 13:44, tagi: php
W pierwszej części Log class – klasa loggera zdarzeń rozpoczęliśmy prace nad klasą logowania zdarzeń. Utworzyliśmy interfejs klasy, który będzie implementowany. W tej części zajmiemy się implementacją tego interfejsu.
Z racji użycia interfejsu, klasy naszego loggera muszą zawierać 3 publiczne, statyczne metody: error()
, warn()
, info()
. Najłatwiejszym, a zarazem dość przenośnym rodzajem klasy logowania do napisania jest logowanie do pliku. Zatem stwórzmy taką klasę:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php class logFile implements log_log { public static function error($err){ echo 'logFile - error |'.$err; } public static function warn($err){ echo 'logFile - warn |'.$err; } public static function info($err){ echo 'logFile - info |'.$err; } } ?> |
Taki zarys musi mieć (ze względu na implementację interfejsu) nasza klasa logFile
– logująca do pliku. Jednak to co mamy do tej pory nie jest zbyt użyteczne Zatem zajmijmy się wypełnieniem metod:
Wszystkie z trzech metod mają za zadanie zapisać informację do logu, z tą różnicą, że są to informacją z inną flagą (błąd, ostrzeżenie, informacja). Zatem możemy je połączyć w jedną write()
, która będzie zapisywać log do pliku.
<?php /** * Zapis pojedynczego komunikatu * @param string $logMsg Pojedynczy komunikat */ private function write($logMsg){ file_put_contents(self::$file_name,$logMsg,FILE_APPEND | LOCK_EX); } ?>
Zapis do logu jak widzimy możemy przeprowadzić za pomocą file_put_contents, z ustawionymi flagami FILE_APPEND | LOCK_EX
– dopisywaniem do pliku, jeśli istnieje oraz blokowaniem dostępu do pliku na czas zapisu. Dzięki temu logów w naszym pliku będzie przybywało, nie będą zastępowane, nadpisywane.
Po dodaniu metody write trzy wcześniej utworzone powinny ją wywoływać. Zatem w ciele metod dodajemy wywołanie metody write:
<?php /** * Dodanie komunikatu informacyjnego do logów * @see log_log#info($msg) */ public static function info($msg){ self::write(self::logPrefix('INFO').$msg); } ?>
Pojawiła się tu nowa rzecz: self::logPrefix('INFO');
. Otóż jest to wywołanie kolejnej metody, która ma za zadania do linii logu dodać informację o rodzaju zdarzenia, które jest logowane. Jak ta metoda wygląda w przypadku logowania do pliku? Następująco:
<?php /** * Dodanie przedrostka do linijki logu * @param string $flag Flaga określająca rodzaj zdarzenia * @return string */ private function logPrefix($flag){ return "\n".date('Y-m-d H:i:s')."\t|".$flag."\t|\t"; } ?>
Przyjęty format pliku logu wygląda następująco:
TIMESTAMP |TYPE | MESSAGE
Przykładowo:
2009-09-02 10:50:07 |INFO | Pomyślnie zakończono akcję 123 2009-09-02 10:50:07 |WARN | Brak aktywnych zadań 2009-09-02 10:50:33 |ERROR | Połączenie zerwane
Wykańczając naszą klasę loggera dogramy kilka szczegółów: wybór pliku logu, ustawienie domyślnego logu w przypadku jego braku. Możemy to zrobić na kilka sposobów, jeden z nich: