Logging in Contao

Contao hat einen sehr einfachen Log-Mechanismus. Die Klasse System hat eine Methode log, die drei Parameter entgegen nimmt:

/**
 * Add a log entry
 * @param string log message
 * @param string e. g. class method name
 * @param string category
 */
 protected function log($strText, $strFunction, $strAction)

Die Einträge werden in der Datenbank in der Tabelle tl_log gespeichert.Ein solcher Aufruf kann in einem Backend bzw. Frontend-Modul z. B. folgendermaßen aussehen:

 $this->log('Das ist ein Test-Log-Eintrag Nr. '.$i, __CLASS__.'::'.__FUNCTION__, TL_GENERAL);

Im Backend sieht das dann so aus:

Hier ist die Log-Ansicht im Contao Backend zu sehen.

In der Detailansicht tauchen dann nähere Angaben zur Kategorie, Herkunft und Browser, sowie IP auf. Ich möchte nicht wissen, was die Datenschützer dazu sagen… aber das nur am Rande.

Das ganze hat jedoch auch einen Hacken. Falls mit sehr vielen Log-Einträgen gearbeitet wird oder in einem Modul viele Einträge generiert werden, leidet aufgrund der Datenbanklösung die Performance. Das Schreiben von vielen Einträgen dauert natürlich seine Zeit. Außerdem reagiert das Backend schon bei ca. 100.000 Einträgen merklich langsamer. Ein schneller dateibasierter Logging-Mechanismus gibt es in Contao leider nicht.

Ein weiterer Nachteil sehe ich im Fehlen von Log-Levels (z. B. Info, Debug, Warning, Error). Hier bleiben nur die Konstanten, die Contao vordefiniert. Diese stehen in system/constants.php und sind zur Zeit:

define('TL_ERROR', 'ERROR');
define('TL_ACCESS', 'ACCESS');
define('TL_GENERAL', 'GENERAL');
define('TL_FILES', 'FILES');
define('TL_CRON', 'CRON');
define('TL_FORMS', 'FORMS');
define('TL_CONFIGURATION', 'CONFIGURATION');
define('TL_NEWSLETTER', 'NEWSLETTER');
define('TL_REPOSITORY', 'REPOSITORY');

Fazit
Für kleinere Module, die nur die wichtigsten Meldungen loggen wollen, reicht die Lösung in Contao natürlich vollkommen aus. Für große Module, die sehr viele Einträge schreiben, diese nicht unbedingt im Backend anzeigen wollen (sondern nur bei Bedarf ausgewertet werden) und die Performance wichtig ist, empfehle ich eine Lösung wie z. B. log4php. Bei einem dateibasierten Logging kann es zudem nicht passieren, dass die Log-Einträge weg sind, wenn die Datenbank-Tabelle beschädigt ist (was bei MyISAM als Storage-Engine durchaus passieren kann).

Ein Gedanke zu “Logging in Contao

Kommentar verfassen