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

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

  1.  

    Danke, dieser blog hat mir schon eimal sehr geholfen. Ich hätte nur eine Frage. Wie würde ich es am betsen umsetzen, wenn ich mehrere Logger Instanzen benötige. Z.b. das TCP relewante meldungen und beispielseweise abgefangene Exceptions in getrennten Dateien gelogt werden?

    • Hallo,

      im Grunde ist das ganz einfach. In er Beispielapplikation wird NLog als Logging-Komponente eingesetzt und NLog unterstützt unterschiedliche Logging-Targets (https://github.com/nlog/NLog/wiki/Targets). Die unterschiedlichen Logging-Targets (File, Datenbank, E-Mail, usw.) werden in der Konfiguration hinterlegt. Zu den einzelnen Logging-Targets kann dann noch konfiguriert werden was geloggt werden soll. Hier mal der Link zur Dokumentation: https://github.com/NLog/NLog/wiki/Tutorial#multiple-targets

      Eine weitere Möglichkeit wäre die Verwendung des Logging Application Block aus der Enterprise Library von Microsoft. Dort gibt es ein komfortables Konfigurationstool, welches es ermöglicht die verschiedenen Logging-Targets innerhalb einer Oberfläche zu konfigurieren. Das wird hier hier beschrieben:

      Logging mit der Enterprise Library (Teil 1)

      Logging mit der Enterprise Library (Teil 2)/

       
  2.  

    Ich habe das Problem, das mit der hier beschriebenen Methode alle Logger instanzen demn gleichen Namespace haben (PrismMahAppsSample.Shell.Logging) ich also per config (name=“name.space.*“) nicht unterscheiden kann.

    • Hallo,

      für zwei separate Logger könnte die Konfiguration so aussehen:

      Innerhalb des Programs würde man dann so zugreifen:

      Um den richtigen Logger auszuwählen könnte man eine weitere Log-Methode implementieren, die eine Enumeration (z.B. TcpLogger, ExceptionLogger, usw.) als Parameter erhält.

      Eine weitere Möglichkeit wäre die Implementierung eines eigenen Logging-Service. Hier mal ein Beispiel auf Basis der Enterprise Library: https://github.com/steve600/VersatileMediaManager/blob/master/Source/Infrastructure/VersatileMediaManager.Infrastructure/Services/LoggingService.cs

      Dieser Service implementiert das Interface ILoggingService und nutzt die Enterprise Library für die Logging-Funktionalität. Der Service wird dann im DI-Container registriert und steht somit applikationsweit zur Verfügung. Die Konfiguration der Logging-Targets erfolgt dann über das Konfigurationstool der Enterprise Library. Beim Aufruf der Log-Methode wir das Logging-Target dann einfach mit dem Parameter „category“ bestimmt. Darüber hinaus gibt es die Möglichkeit mehrere Logging-Targets anzugeben.

       

leave your comment

Fork me on GitHub