Dzisiaj o bibliotece Monolog, która prawdopodobnie na dobre zadomowiła się w niektórych aplikacjach PHP. Służy do generowania różnego rodzaju logów. Jest bardzo fajnie przemyślana i rozszerzalna. Możemy sobie praktycznie wszystko ustawić tak jak chcemy, począwszy od nazw plików dziennika, przez format zapisu, aż do dodatkowych informacji załączanych do poszczególnych wpisów.
„Initial commit” na GitHubie powstał dokładnie 16 lutego 2011 r. Monolog liczył sobie wtedy zaledwie 383 linijki kodu. Już po kilku dniach autor dokonał poważnych zmian w źródłach w celu dostosowania struktury i działania biblioteki do pythonowego Logbook. W czerwcu 2011 r. biblioteka zaczyna współpracować z Composerem. Ostatnim „kamieniem milowym” było uruchomienie ciągłej integracji w serwisie Travis w listopadzie 2011 r.
Jeśli idzie o ocenę jakości kodu to nie mam do czego się przyczepić. Biblioteka trzyma się nazewnictwa PSR-0 oraz standardów PSR-1 i 2. Można śmiało używać standardowego SplClassLoadera lub autoloader.php wygenerowanego przez Composera. Komentarze dot. stałych, zmiennych, klas i metod są na tyle jasne, że łatwo można się połapać co do czego służy i jak to rozbudować.
Podstawowy sposób użycia wygląda tak:
// importujemy logger i podstawowa obsluge plikow
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// tworzymy obiekt logger i handler
$debugLogger = new Logger('moj_debug_logger');
// wybieramy plik i poziom waznosci wpisow, od ktorych beda zapisywane w dzienniku
$debugHandler = new StreamHandler(__DIR__.'/debug.log', Logger::DEBUG);
// umieszczamy handler w loggerze
$debugLogger->pushHandler($debugHandler);
// od teraz mozna umieszczac wpisy w loggerze np.
$chybaInteger = 1.0;
if (!is_integer($chybaInteger)) {
$debugLogger->addDebug(
'Nie podoba mi sie typ zmiennej $chybaInteger :' . gettype($chybaInteger)
);
}
Loggery i handlery można ze sobą dowolnie mieszać. Stworzymy sobie 2 loggery: db_logger i app_logger oraz 2 handlery: plików debug.log i powiadamiający mailem o poważnych błędach.
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\NativeMailerHandler;
$appLogger = new Logger('app_logger');
$dbLogger = new Logger('db_logger');
$debugFileHandler = new StreamHandler(__DIR__.'/debug.log', Logger::DEBUG);
$appLogger->pushHandler($debugFileHandler);
$dbLogger->pushHandler($debugFileHandler);
$errorMailHandler = new NativeMailerHandler(
'jakis@mail.com',
'Powazny blad w aplikacji',
'donotreply@moja_appka.pl',
Logger::ERROR);
$appLogger->pushHandler($errorMailHandler);
$dbLogger->pushHandler($errorMailHandler);
// w pliku debug.log powstanie wpis
// [2012-07-15 12:57:46] app_logger.WARNING: Ostrzezenie [] []
// mail nie bedzie wyslany
$appLogger->addWarning('Ostrzezenie');
// powiedzmy, ze nie mozna polaczyc z baza danych
// blad krytyczny laduje w debug.log i zostaje wyslany mailem
$dbLogger->addAlert('Nie mozna polaczyc z baza danych');
Możemy również dodawać informacje dodatkowe (tu nazywane Processors), np. szczytowe zużycie pamięci lub informacje na temat żądania HTTP za pomocą metody pushProcessor()
.
Jeśli jeszcze nam mało to możemy sobie zmieniać format zapisu logów za pomocą formatterów. Jeśli komunikaty mają być przetwarzane automatycznie to polecam JsonFormatter
.