Ausgefallen gut ins Netz!

Hinter dem Namen Wicked Software stehen ausgefallen gute und begeisterte Entwickler, für die Software wesentlich mehr ist als funktionierender Code. Wicked Software hat sich auf Joomla! spezialisiert und bietet moderne und flexible Erweiterungen.

Wir schreiben in unseren Blog mit und über Joomla!, unsere Software, Tricks & Tipps und alles was uns in den Sinn kommt und uns nützlich erscheint.

  • PHP
  • Code-Snippet
  • Entwickler
Protokoll führen zum Debuggen und Performance messenbuggen und Performance messen

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');