[Fehlerbehandlung] Es wird eine Klasse zur Fehlerbehandlung und Protokollierung benötigt

21.08.2012 09:59 Uhr

Anforderungen
Einheitliche Fehlerbehandlung in einem System mit der dazugehörigen Protokollierung und Benachrichtigung per E-Mail sowie einer automatischen Überwachung/Bereinigung der anfallenden Datenmenge.

Verschiedene Fehlerstufen wie z.B. NOTICE, WARNING, ERROR und FATAL ERROR sollten entsprechende und angemessene Aktionen zur Folge haben.

 

Aufgabe
Bitte skizzieren Sie kurz einen Lösungsweg für die genannten Anforderungen und bilden interessante Teile davon in Code ab.

1 Antwort

#1

21.08.2012 14:03 Uhr

Ich verstehe die Anforderung "automatischen Überwachung/Bereinigung der anfallenden Datenmenge" nicht. Nichtsdestotrotz meine Gedanken:

Die Logging Komponente besteht aus folgenden Klassen:

  • Logger
  • Writer
  • Filter

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

 

Ähnliche Fragen



Datenschutzerklärung · Impressum