Logs
Table of Contents
Das SetaFramework verwendet als Log-Lösung monolog/monolog, jedoch sind sämtliche Abhängigkeiten lediglich zu PSR3 (ähnlich wie beim Cache) und die einzige Stelle an der eine feste Abhängigkeit zu Monolog besteht ist im MonologBuilder und der logHandlers.ini.
Die Struktur ist von Monolog übernommen. Auf globaler Ebene konfiguriert man Handler, die definieren, was genau mit den Log-Nachrichten passiert. Und auf der Applikationsebene sind Channel konfiguriert, die definieren, welche Handler für die Log-Nachrichten verwendet werden (es können auch mehrere konfiguriert werden).
bootstrap.ini
In der bootstrap.ini sollte für üblich auf eine extra Konfigurationsdatei verlinkt werden:
logger.handlers = @@logHandlers.ini
logHandlers.ini
Die logHandlers.ini sieht z.B. wie folgt aus:
; logger handler - defines where the log will be saved. ; handlers: file, rotatingFile, syslog, errorLog, mail, swiftMailer, group, buffered, fingersCrossed, filter, bufferedFile, bufferedRotatingFile, bufferedMail, bufferedSwiftMailer default.type = group ; group, buffered, fingersCrossed, filter need a handler; you can define multiple handlers separated by ',' default.handler = logOnTrigger ; logger level, every handler has this except of fingersCrossed ; allowed levels are: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY; default is NOTICE ; for information look http://tools.ietf.org/html/rfc5424 ; default.level = NOTICE ; max level - used for group and filter ; default.maxLevel = ALERT unexpectedOutput.type = file unexpectedOutput.path = @../logs/unexpectedOutput.log unexpectedOutput.level = DEBUG logOnTrigger.type = fingersCrossed logOnTrigger.handler = setasignLog ; activationLevel can be a single error level ;logOnTrigger.activationLevel = WARNING ; or an array of multiple error levels for each channel name: the key is the channel name ; key 'default' = default for not defined channels logOnTrigger.activationLevel.default = WARNING logOnTrigger.activationLevel.phpError = NOTICE ;logOnTrigger.stopBuffering = 1 setasignLog.type = bufferedRotatingFile setasignLog.path = @../logs/setasign.log setasignLog.maxFiles = 10 setasignLog.level = DEBUG ; buffersize, default 0; only for: buffered, fingersCrossed, bufferedFile, bufferedRotatingFile, bufferedMail ;setasignLog.bufferLimit = setasiteLog.type = bufferedRotatingFile setasiteLog.path = @../logs/setasite-pages.log setasiteLog.maxFiles = 10 databaseQueryLog.type = bufferedFile databaseQueryLog.path = @../logs/db-debug.log databaseQueryLog.level = NOTICE
Hierbei werden alle Handler konfiguriert, die verwendet werden. Diese Handler definieren, was genau mit den Log-Nachrichten passieren soll. Also zum Beispiel, in welche Datei die Log-Nachrichten geschrieben werden und ab welchem Level eine E-Mail verschickt werden soll.
Um den Handler anschließend verwenden zu können, muss in der Applikationskonfiguration noch definiert werden, welcher Handler verwendet werden soll.
Der Handler mit dem Namen "default" stellt hier eine Besonderheit dar. Auf diesen Handler wird immer zurückgefallen, falls für einen Channel kein spezieller Handler definiert werden.
Channelkonfiguration
Jeder Kanal hat seine eigene Konfiguration. Um die Kanäle zu aktivieren, ist in der bootstrap.ini Konfiguration folgendes standardmäßig hinterlegt:
; defines whether the "bootstrap" channel should be logged bootstrap.logger.enabled = 1 ; when enabling this channel all php errors will no longer be logged over the 'bootstrap' channel ; instead 'phpError' will be used; default 0 bootstrap.phpError.logger.enabled = 1 bootstrap.unexpectedOutput.logger.enabled = 1 bootstrap.unexpectedOutput.logger.handler = unexpectedOutput
In der Applikationskonfiguration können folgende Konfigurationen vorgenommen werden:
logger.database.enabled = 1 logger.database.handler = databaseQueryLog
In diesem Beispiel heißt der Channel "database" und verwendet den Handler "databaseQueryLog".
Falls hier kein Handler definiert wird, wird auf den Handler vom "default"-Channel zurückgefallen und falls dieser nicht definiert ist, auf den Handler mit dem Namen "default".
Das enabled-Flag muss nicht konfiguriert werden, ein Channel ist standardmäßig aktiv (kann aber deaktiviert werden). Das enabled-Flag vom "default"-Channel überschreibt jedoch diesen Standard. Falls der "default"-Channel deaktiviert wird, sind also alle Channel, die nicht explizit auf enabled stehen, ebenfalls deaktiviert.
Verwendung
Um nun einen konfigurieren Logger zu verwenden, kann aus dem Applikations-Di der ApplicationLogHandler geholt werden. Mit der Methode "ApplicationLogHandler::getLogger($channelName)" kann anschließend der entsprechende Logger geholt werden.
$databaseLogger = $application->getDi()
->get(ApplicationLogHandler::class)
->getLogger('database');
$databaseLogger?->error('Something bad happened: {message}', [
'message' => $e->getMessage()
]);
