Ich verstehe die Anforderung "automatischen Überwachung/Bereinigung der anfallenden Datenmenge" nicht. Nichtsdestotrotz meine Gedanken:
Die Logging Komponente besteht aus folgenden Klassen:
Logger
Die Klasse Logger kümmert sich um das Annehmen von Meldungen. Sie stellt die Methode "log" zur Verfügung:
<?php public function log( $message, $priority = Logger::PRIO_INFO ) {} ?>
Als zweiter Parameter kann die Priorität der Meldung angegeben werden. Dies erfüllt die Anforderung der verschiedenen Fehlerstufen.
Zusätzlich zur Methode log, wird noch die magische Methode __call( $name, $parameter ) implementiert. Die __call Methode wird immer dann ausgeführt, wenn ich auf meinem Objekt eine Methode ausführen möchte, die nicht implementiert ist.
<?php $logger->info( 'auto' ); ?>
ist das gleiche wie:
<?php $logger->__call( 'info', array( 'auto' ) ); ?>
<?php
public function __call ( $name, $parameters ) {
if ( $this->isKnownLoggerPriority( $name ) === false ) {
// Error handling
throw new Exception( 'Unknown method ' . $name );
}
$this->log( $name, $parameters[0] );
}
?>
Somit können wir auf der Logger Instanz die Priorität als Methode verwenden.
Writer
Die Writer sind verschiedene Ausgabekanäle die wir zu unserm Logger hinzufügen können:
- Writer_Mail => versendet die Nachricht als E-Mail
- Writer_Log => schreibt die Nachricht in ein Logfile
- Writer_Db => schreibt die Nachricht in eine Datenbank
.....
Über die Methode "addWriter" die in der Logger Klasse implementiert ist, können die verschiedenen Writer hinzugefügt werden.
Wird etwas an den Logger übergeben, z.B. $logger->debug( 'Test' ); iteriert dieser über seine bekannten Writer und reicht die Meldung an diese weiter.
Die einzelnen Writer verarbeiten diese Meldung dann auf ihre Art und Weise.
Da wir aber nicht wollen, dass alle Meldungen permanent auf allen Kanälen/Writern verteilt werden sollen, gibt noch die Klasse Filter.
Filter
Die Instanz von Filter wird von jedem Writer gehalten und sagt dem Writer, welche Priotität(en) für ihn interessant sind:
<?php // Methode log in Klasse Logger
public function log( $message, $priority = Logger::PRIO_INFO ) {
foreach ( $this->writer as $writer ) {
// Not our party :)
if ( $writer->isCapable( $priority ) === false ) {
continue;
}
$writer->log( $message, $priority );
}
}
|