Logs

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.

PHP
$databaseLogger = $application->getDi()
->get(ApplicationLogHandler::class)
->getLogger('database');

$databaseLogger?->error('Something bad happened: {message}', [
	'message' => $e->getMessage()
]);