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.

TypBeschreibung
ALLEs werden alle Log-Nachrichten die vom Logger an den Handler gesendet werden vom Handler verarbeitet.
TRACEEs werden alle Meldungen die mit Logger::logTrace(), Logger::logDebug(), Logger::logInfo(), Logger::logWarn(), Logger::logError() und Logger::logFatal() geschrieben wurden vom Handlerverarbeitet.
DEBUGEs werden alle Meldungen die mit Logger::logDebug(), Logger::logInfo(), Logger::logWarn(), Logger::logError() und Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
INFOEs werden alle Meldungen die mit Logger::logInfo(), Logger::logWarn(), Logger::logError() und Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
WARNEs werden alle Meldungen die mit Logger::logWarn(), Logger::logError() und Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
ERROREs werden alle Meldungen die mit Logger::logError() und Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
FATALEs werden nur Meldungen die mit Logger::logFatal() geschrieben wurden vom Handler verarbeitet.
OFFEs werden keine Logeinträge verarbeitet.

Logfunktionen und Auswirkung

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

MethodeEinsatzgebietZustand der AnwendungAktion
logTrace()Loggen einzelner Schritte im Programmablauf.FehlersucheTiefgreifendes Debugging des Entwicklers
logDebug()Loggen von Daten an wichtigen Stellen im Code, die zum Debuggen von Fehlern hergenommen werden könnenFehlersucheDebugging des Entwicklers oder Administrators
logInfo()Informationen für den Administrator zum Verhalten der AnwendungNormalKeine
logWarn()Warnungen über mögliche Fehler in der AnwendungDie 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 AnwendungDie Funktionsweise der Anwendung ist stark eingeschränkt.Identifizierung des Fehlers und Beseitigung der Fehlerquelle veranlassen
logFatal()Fehler die ein kritisches Verhalten der Anwendung herbeiführenDie Anwendung oder wichtige Funktionen funktionieren nichtSofortige Maßnahmen einleiten

Standard Logger

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

NameBeschreibungBeispiel
applicationLogeinträge der Anwendung (Verwendung direkt in der Anwednungsklasse)
databaseLogeinträge im Zusammenhang mit DatenbankenFehler bei MySQL-Select
defaultStandardlogger (keine Verwendung im Framework)
frameworkMeldungen des Alvine-Frameworks, sollten nicht von Anwendungen und Komponenten verwendet werden
httpSpezielle Netzwerklogging für das HTTP-ProtokollDie HttpClient Klasse loggt hier jeden Request im TRACE Level
ioInput/Output Logging: Alle DateifunktionenFehler bei in den IO-Klassen
networkingLogeinträge die das Networking betreffenÜbertragene Daten des Sockets
presenterLogeinträge die in einer Presenter-Klasse geschrieben werden
routingLogeinträge im Zusammenhang mit dem RoutingLogging 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!');