Manchmal gibt es so Fehler ... die können Nerven kosten. Treten eventuell sporadisch auf und nur online beim Kunden wo man kein direktes Debugging machen kann oder darf.
Eine Möglichkeit, solchen Fehlern auf die Schliche zu kommen ist die Verwendung von Log. Damit protokolliert man eigene Einträge in ein eigenes Logfile.
Eigenes Logfile einrichten
Joomla! legt im Verzeichnis logs einige Logfiles an. Dem wollen wir in nichts nachstehen, aber mit einer eigenen Datei, nur für unseren Zweck. Das heißt, sie soll nur unsere messages aufnehmen.
Dazu müssen wir einen sogenannten Logger definieren.
<?php // Nutze den Namepace des Loggings use Joomla\CMS\Log\Log; .. [] .. Log::addLogger( // Definiert den Namen der Datei, in welche der Logger protokolliert. ['text_file' => 'mylogfile.php'], // Welche Typen von Meldungen soll der Logger protokollieren? (INFO, ERROR, ...) Log::ALL, // Welche Kategorien von Meldungen soll der Logger protokollieren? ['mymessage'] );
Das neue Namespace-Konzept in Joomla! 3.8
Manch einer fragt sich vielleicht: Was zum Teufel? Das heisst doch JLog?
Wie ich mal in einem Vortrag gesagt habe: "Sisyphus war ein glücklicher Mann!". Immer wenn er den Felsbrocken fast oben hatte, entglitt er ihm und polterte wieder herunter. Ähnlich ist es in der Joomla! Entwicklung. Der Core wird immer wieder verbessert - und Entwickler von Erweiterungen sind gut beraten, ihren Code immer wieder anzupassen um davon zu profitieren. Bis zur Version 3.7 waren die Klassen von Joomla! nach der Methode "führendes J" + Klassenname aufgebaut.
Seit Version 3.7 wird Joomla auf das Namespace-Konzept von PHP hingeführt. Die gewohnte Schreibweise
JLog::addLogger( ... );
funktioniert noch immer, Joomla! verspricht Backwardkompatibilität innerhalb der 3er Reihe. Das heißt, dass alle (sauber programmierten) Extensions weiter lauffähig sind. Um aber zukunftssicher zu sein, sollte ab sofort die neuen Klassenstruktur von Joomla! verwendet werden, also kein JLog mehr.
Logsätze schreiben
Alle Logeinträge vom Typ mymessage werden nun in das neue Logfile gespeichert.
Das Beispiel zeigt, wie Sätze ins Logfile gebracht werden:
<?php use Joomla\CMS\Log\Log; .. [] .. $params = JComponentHelper::getParams('com_mycomponent'); if (!empty($params)) { Log::add(print_r($params, true), LOG::INFO, 'mymessage'); } else { Log::add('Parameter nicht vorhanden', LOG::ERROR, 'mymessage'); }
Das Log file ist im Verzeichnis logs zu finden. Hier könnten alle relevanten Informationen stehen, die bei der Fehlersuche helfen könnten. So kann das zum Beispiel aussehen:
#Fields: datetime priority clientip category message 2017-10-14T08:38:40+00:00 ERROR ::1 mymessages Parameter nicht vorhanden 2017-10-14T08:40:56+00:00 INFO ::1 mymessages Joomla\Registry\Registry Object ( [data:protected] => stdClass Object ( [show_author] => 0 [show_create_date] => 0 ) [initialized:protected] => 1 [separator] => . )
Performance messen mittels Log
Praktischerweise sind die Sätze mit dem exakten Zeitstempel versehen. So sind sie auch hilfreich, um Verarbeitungszeiten zu messen, oder die Zeit, die ein User braucht, um eine Aktion durchzuführen. Dazu muss man nur vor und nach einer Aktion, z.b. einer Datenbankabfrage, einen Logeintrag schreiben oder eine Zeitdifferenz ermitteln und ausgeben. Wer es auf Microsekunden genau wissen will verwendet dafür die microtime.
<?php $start_time = microtime(true); // do something $diff = microtime(true) - $start_time; Log::add($diff . ' = Verbrauchte Zeit für something', LOG::INFO, 'mymessage');