Welches Entwurfsmuster eignet sich besser für die Protokollierung?


10

Ich sollte einige Ereignisse in einem Programm protokollieren, aber soweit ich weiß, ist es besser, den Protokollierungscode außerhalb des Programms zu belassen, da es nicht um die tatsächliche Funktionalität des Programms geht. Können Sie mir also sagen, ob ich es vollständig aus dem Code heraushalten und nur Beobachter und Zuhörer verwenden soll, um die Ereignisse zu protokollieren? Oder ich kann eine Codezeile wie die folgende hinzufügen, wo immer ich etwas protokollieren muss:

MyGloriousLogger.getXXXLogger().Log(LogPlace, new LogObject(z1, z2, z3, z4, ..., z99));

Mache ich einen Fehler bei der Verwendung des Observer-Entwurfsmusters? Ich brauche ein anderes Designmuster? Oder sollte ich aufhören, über Designmuster nachzudenken?

PS1. Wenn ich mich nur mit Zuhörern und Beobachtern anmelden möchte, muss ich die Beobachter und Zuhörer des Programms hinzufügen und verbessern.

PS2. Ich weiß sicherlich, dass es verschiedene Bibliotheken für die Protokollierung in Java gibt und ich java.utils.logging verwende, aber ich benötige einen Wrapper, um meine speziellen Objekte zu protokollieren.


2
Java hat bereits 17 Protokollierungs-Frameworks und Meta-Protokollierungs-Frameworks (slf4j) und wahrscheinlich einige Meta-Meta-Protokollierungs-Frameworks, von denen keines für Sie funktioniert.
Kevin Cline

Antworten:


15

Loggingwird normalerweise mit dem Muster der Verantwortungskette implementiert . Natürlich können (und ich würde) das mit einer Fassade kombinieren . Ich würde Listener (s) oder Observer (s) wirklich nicht selbst verwenden.

Verantwortungskette - Logger


Bedeutet dies im Grunde "Schreiben Sie in Ihren Code in Ihren abstrakten Logger"? Ich denke, meine Frage lautet: Soll ich Ereignisse auslösen, von denen aus ich mich protokollieren möchte, und einen Listener bereitstellen, der sich als Antwort auf Ereignisse anmeldet, oder sollte ich direkt meinen Logger-Dienst anrufen (der die interne Verantwortungskette verwendet) und das war's?
Feuer-Drachen-DoL

8

Verwenden Sie die aspektorientierte Programmierung, bei der After-, Before- und Around-Ratschläge zu Methoden verwendet werden. Dort können Sie je nach Bedarf Protokolle vor dem Start der API, nach oder unter bestimmten Bedingungen hinzufügen und Ihren Hauptcode vom Protokollcode trennen.


0

Nun, Observer klingt für mich ungeeignet. Wenn Sie Logger-Aufrufe "wo immer Sie brauchen" werfen, wird Ihr Code zerstört und die SRP verletzt.

Sie könnten beispielsweise an AOP interessiert sein, sodass Sie Logger-Aufrufe über Methodenanmerkungen anhängen können.


0

Die Verantwortungskette scheint ein gutes Muster zu sein, wenn Ihre Ausgabe an mehreren Stellen landen kann. In der UML haben Sie einen anderen Logger, der zur Konsole, zum anderen zu errorFile und zum dritten einfach zum Info-Logger führt.

Normalerweise habe ich gesehen, dass logLevels unterschiedlich sind, aber die Protokolldatei dieselbe ist.

Ich sehe das Beobachtermuster für die Protokollierung nicht so schlecht, da es Ihren Protokollierungscode vom Anwendungscode entkoppelt. Auf diese Weise ist die Migration auf verschiedene Protokollierungsmechanismen einfach. Jedes Mal, wenn Sie ein Ereignis protokollieren möchten, wird ein Ereignis ausgelöst, und der entsprechende Listener empfängt das Ereignis und protokolliert es. Es sollte ein Zwischen-Singleton-Objekt geben, das die Liste aller Register enthält.

Auf diese Weise sehe ich, dass wir unseren Protokollierungscode vom Anwendungscode entkoppeln können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.