MahApps.Metro in Verbindung mit der PRISM-Bibliothek (Teil 5: Logging)

Gerade in größeren Applikationen ist Logging unverzichtbar. Dabei erfüllt das Logging im Allgemeinen zwei Hauptanforderungen:

  • Überwachung der Applikation
  • Bereitstellung von Informationen

Die protokollierten Informationen können in den folgenden Situationen hilfreich sein:

  • sind Fehler innerhalb der Applikation aufgetreten
  • sind evtl. einzelne System ausgefallen (in verteilten Anwendungen)
  • im Falle von unerwarteten Ergebnissen
  • warum dauert ein Prozess länger als sonst (z.B. Berechnungen, DB-Zugriffe, usw.)

Die PRISM-Bibliothek bietet nun einen einfachen Mechanismus für das Logging über das ILoggerFacade-Interface.

ILoggerFacade-Interface

Das ILoggerFacade-Interface definiert lediglich eine Methode, die wie folgt aufgebaut ist:

Die Initialisierung einer PRISM-Anwendung erfolgt ja innerhalb des Bootstrapping-Prozesses (siehe dazu MahApps.Metro in Verbindung mit der PRISM-Bibliothek (Teil 1: Erstellung der Solution)). Innerhalb dieses Prozesses wird als erster Schritt mit der Methode CreateLogger ein Logging-Objekt erzeugt, welches das ILoggerFacade-Interface implementiert. Die PRISM Standardimplementierung sieht dabei wie folgt aus:

Hier wird also ein einfacher Textlogger erzeugt und zurückgegeben. Da diese Methode als virtual deklariert wurde kann diese überschrieben werden und einer eigener Logger zurückgegeben werden. Dieser Logger muss natürlich das Interface ILoggerFacade implementieren und genau das wollen wir jetzt einmal auf Basis des NLog-Frameworks (https://github.com/NLog/NLog) tun. Ich möchte hier jetzt nicht weiter auf Details bzw. Funktionen von NLog eingehen (ich werde bei Gelegenheit mal einen eigenen Betrag zu diesem Framework schreiben). Wer weitere Informationen zu diesem Framework sucht kann sich mal im Projekt-Wiki – https://github.com/NLog/NLog/wiki – umsehen. Das NLog-Framework kann einfach über den NuGet-Paketmanager installiert werden:

PrismMahAppsSample_18

Ist das erledigt legen wir eine neue Datei mit dem Namen NLogLogger.cs an.

PrismMahAppsSample_20

Die Implementierung der neuen Klasse NLogLogger sieht wie folgt aus:

Damit wäre der Logger auch schon fertig und jetzt muss das NLog-Framework noch konfiguriert werden. Dafür muss der Solution eine neue Konfigurationsdatei namens NLog.config hinzugefügt werden:

PrismMahAppsSample_19

Die Minimalkonfiguration sieht dann wie folgt aus:

Hier wird in Zeile 6 ein Logging-Ziel definiert, welches die Logeinträge in eine Datei namens Logs.txt schreibt. In Zeile 10 wird ein Logger erzeugt, der alle Log-Meldungen mit einem Log-Level von mindestens Trace in das in Zeile 6 definierte Logging-Ziel wegschreibt. Weitere Informationen zu der Konfiguration von NLog finden sich im Projekt-Wiki von NLog (https://github.com/NLog/NLog/wiki/Configuration-file).

Im letzten Schritt müssen wir den neu erstellten Logger noch im Bootstrapping-Prozess bekannt machen bzw. registrieren. Dafür überschreiben wir einfach die Methode CreateLogger in der Bootstrapper-Klasse (die Basisimplementierung gibt einen einfachen Textlogger zurück):

Damit wäre der Logger fertig. Möchte man eine Log-Nachricht schreiben kann man die Instanz des Loggers aus dem DI-Container beziehen und die Log-Methode aufrufen:

Die Logdatei befindet sich im Programmverzeichnis und hat mit der oben gezeigten Konfiguration den folgenden Aufbau:

PrismMahAppsSample_21

Erweiterung um einen eigenen Logging-Service

Sollten die Logging-Funktionalitäten nicht ausreichen besteht die Möglichkeit einen eigenen Logging-Service zu implementieren. Dieser Service kann z.B. auf NLog oder auf dem Logging Application Block der Microsoft Enterprise Library basieren. Hier mal ein kleiner Überblick über den Logging Application Block:

Wie man einen eigenen Logging-Service implementiert beschreibe ich in einem nächsten Artikel.

Github-Repository

Der aktuellste Quellcode (inkl. dem Logger auf Basis NLog über das ILoggerFacade-Interface) ist in folgendem Github-Repository verfügbar: https://github.com/steve600/PrismMahAppsSample

Fork me on GitHub