Logbuch und Fehlersuche

Für die Fehlersuche steht mit der Logger-Klasse ein Werkzeug für die Systemanalyse bereit. Die Logger-Klasse ist dabei so konzipiert, das Sie nicht zu schwerfällig ist (siehe Log4j), aber trotzdem eine gute und erweiterbare Funktionalität bereitstellt.

Loglevel

Der Loglevel in der Konfiguration gibt an welche Meldungen von dem Handler verarbeitet werden. Der Loglevel ist ein Filter der in der Reihenfolge ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF ausgewertet wird.

Typ Beschreibung
ALL Es werden alle Log-Nachrichten die vom Logger an den Handler gesendet werden vom Handler verarbeitet.
TRACE Es werden alle Meldungen die mit Logger::logTrace(), Logger::logDebug(), Logger::logInfo(), Logger::logWarn(), Logger::logError() und Logger::logFatal() geschrieben wurden vom Handlerverarbeitet.
DEBUG Es werden alle Meldungen die mit Logger::logDebug(), Logger::logInfo(), Logger::logWarn(), Logger::logError() und Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
INFO Es werden alle Meldungen die mit Logger::logInfo(), Logger::logWarn(), Logger::logError() und Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
WARN Es werden alle Meldungen die mit Logger::logWarn(), Logger::logError() und Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
ERROR Es werden alle Meldungen die mit Logger::logError() und Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
FATAL Es werden nur Meldungen die mit Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
OFF Es werden keine Logeinträge verarbeitet.

Logfunktionen und Auswirkung

Mit Hilfe der folgenden Logfunktionen können die Logeinträge im jeweiligen Level geschrieben werden.

Methode Einsatzgebiet Zustand der Anwendung Aktion
logTrace() Loggen einzelner Schritte im Programmablauf. Fehlersuche Tiefgreifendes Debugging des Entwicklers
logDebug() Loggen von Daten an wichtigen Stellen im Code, die zum Debuggen von Fehlern hergenommen werden können Fehlersuche Debugging des Entwicklers oder Administrators
logInfo() Informationen für den Administrator zum Verhalten der Anwendung Normal Keine
logWarn() Warnungen über mögliche Fehler in der Anwendung Die Funktionsweise ist noch nicht eingeschränkt, aber es kann zu nicht gewollten Ergebnissen kommen. Überprüfen der Warnung und nach Möglichkeit Feinjustierung der Konfiguration
logError() Fehler in der Anwendung Die Funktionsweise der Anwendung ist stark eingeschränkt. Identifizierung des Fehlers und Beseitigung der Fehlerquelle veranlassen
logFatal() Fehler die ein kritisches Verhalten der Anwendung herbeiführen Die Anwendung oder wichtige Funktionen funktionieren nicht Sofortige Maßnahmen einleiten

Standard Logger

Es gibt verschiedene Standard-Logger, die für bestimmte Aufgaben bestimmt sind.

Name Beschreibung Beispiel
application Logeinträge der Anwendung (Verwendung direkt in der Anwednungsklasse)
database Logeinträge im Zusammenhang mit Datenbanken Fehler bei MySQL-Select
default Standardlogger (keine Verwendung im Framework)
framework Meldungen des Alvine-Frameworks, sollten nicht von Anwendungen und Komponenten verwendet werden
http Spezielle Netzwerklogging für das HTTP-Protokoll Die HttpClient Klasse loggt hier jeden Request im TRACE Level
io Input/Output Logging: Alle Dateifunktionen Fehler bei in den IO-Klassen
networking Logeinträge die das Networking betreffen Übertragene Daten des Sockets
presenter Logeinträge die in einer Presenter-Klasse geschrieben werden
routing Logeinträge im Zusammenhang mit dem Routing Logging der Router-Klasse

Logbuch

Das Logging kann über eine Konfigurationsdatei gesteuert werden. Je nach gewünschtem Ausgabeumfang kann der entsprechende Filter gesetzt werden. Die Reihenfolge der Filterung stellt sich dabei wie folgt dar: ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF

Beispielcode für das Erstellen eines Loggers.

// Neue Handler für die Ausgabe in eine Datei erstellen.
$handler = new \Alvine\Util\Logging\Handler\File('alvine.log');
// Neuer Logger
$logger = \Alvine\Util\Logging\Logger::getLogger();
// Als Ausgabe soll eine einfache tab-getrennte Liste
// erstellt werden
$formatter = new \Alvine\Util\Logging\Formatter\Plain();
// Zuweisung des handlers und des Formatters
$logger->addHandler($handler);
$handler->setFormatter($formatter);
// Über den Schwellwert kann gesteuert werden,
// welche Meldungen ausgegeben werden sollen.
// In diesem Fall sollen nur Infomeldungen, Warnings,
// Errors und Fatals protokolliert werden.
$handler->setThreshold(\Alvine\Util\Logging\Level::INFO);

// Meldungen mit unterschiedlichen Level
// ausgeben.
$logger->logTrace('Log-Trace');
$logger->logDebug('Log-Debug');
$logger->logInfo('Log-Info');
$logger->logWarn('Log-Warn');
$logger->logError('Log-Error');
$logger->logFatal('Log-Fatal');

// Ergebnis -> 2017-01-02 09:58:22  INFO    Log-Info
//             2017-01-02 09:58:22  WARN    Log-Warn
//             2017-01-02 09:58:22  ERROR   Log-Error
//             2017-01-02 09:58:22  FATAL   Log-Fatal

Handler

Memory

Will man die Logdaten direkt ausgeben (zum Beispiel bei der Entwicklung) kann der MemoryHandler zum Einsatz kommen. Dieser erlaubt es die Lognachrichten als Zeichenkette auszugeben.

// Handler
$handler = new \Alvine\Util\Logging\Handler\Memory();

// Logger
$logger = \Alvine\Util\Logging\Logger::getInstance();
$logger->addHandler($handler);
$handler->setThreshold(\Alvine\Util\Logging\Level::ALL);

/** do something */
$logger->logTrace('Dies ist ein Log-Trace');
$logger->logDebug(' und eine Log-Debug Zeile!');


// Ausgabe der Logdaten
echo $handler->getBuffer();
// Ergebnis -> Dies ist ein Log-Trace und eine Log-Debug Zeile!

Chrome Logger

Der ChromeHandler arbeitet mit der Chrome-Erweiterung Chrome Logger zusammen. Die Chrome-Erweiterung kann über den Chrome-Store oder diesen Link installiert werden. Für einen ersten Test kann man folgenden Beispielcode verwenden.

// ChromeHandler
$handler = new \Alvine\Util\Logging\Handler\Chrome();
// Logger
$logger = \Alvine\Util\Logging\Logger::getLogger();
$logger->addHandler($handler);

// Meldungen mit unterschiedlichen Level
// ausgeben.
$logger->logTrace('Dies ist ein Log-Trace');
$logger->logDebug('Und eine Log-Debug Zeile!');

ElasticSearch

Kibana und Elasticsearch sind ein tolles Gespann für die Auswertung von Lagdateien. Alvine bietet die Möglichkeit direkt nach ElasticSearch zu loggen. dazu muss nur ein Handler

// Handler
$uri = new \Alvine\Net\Resource\URI('http://www.example.com/');
$handler = new \Alvine\Util\Logging\Handler\ElasticSearch($uri, '/alvine-logs/entry/');
// Logger
$logger = \Alvine\Util\Logging\Logger::getLogger();
$logger->addHandler($handler);

// Meldungen mit unterschiedlichen Level
// ausgeben.
$logger->logTrace('Dies ist ein Log-Trace');
$logger->logDebug('Und eine Log-Debug Zeile!');

Loggr.com

Der Dienst loggr.net bietet eine zentrale Stelle, für die Verarbeitung von Lognachrichten. Das Alvine Framework bietet mit der LoggrHandler-Klasse die einfache Möglichkeit Lognachrichten direkt zu loggr zu senden. Dazu muss lediglich ein Handler mit dem entsprechenden API-Schlüssel und dem LogSchlüssel übergeben werden.

// LoggrHandler

$apiKey='GEHEIM';
$logKey='SECRET';

$handler = new \Alvine\Util\Logging\Handler\Loggr($apiKey, $logKey);
// Logger
$logger = \Alvine\Util\Logging\Logger::getLogger();
$logger->addHandler($handler);

// Meldungen mit unterschiedlichen Level
// ausgeben.
$logger->logTrace('Dies ist ein Log-Trace');
$logger->logDebug('Und eine Log-Debug Zeile!');