2009-08-21 18 views
12

Eine Anwendung, an der ich arbeite, erfordert das Protokollieren von Aktionen, den Benutzer, der die Aktion ausführt, und den Zeitpunkt der Aktion für eine Datenbank.Welches Designmuster würden Sie bei der Protokollierung berücksichtigen?

Welches Designmuster ist am beliebtesten/geeignet für die Protokollierung?

Ich denke an Befehlsmuster, die den aktuellen Benutzer und eine Aktion erfordern. Führen Sie die Aktion aus und schreiben Sie in das Protokoll.

Was denkst du? Irgendwelche anderen Alternativen, die ich berücksichtigen kann?

Vielen Dank.

Antwort

10

Sie können AOP verwenden, um die Protokollierung ohne störendes Verhalten anzuwenden. AOP kann sich wie eine Mischung aus Proxy und Decorator Pattern anfühlen.

+0

Yup, AOP ist definitiv eine Option. Danke, dass du mich erinnert hast. – Henry

+0

Die Worte ... ohne aufdringliches Verhalten .. steht für mich. Sollte im Hintergrund passieren und Ihre Anwendung sollte nicht auf "wann" die Protokolle geschrieben werden. – Mukus

2

Ich stimme zu, ich denke, das Befehlsmuster würde am meisten passen, da Sie alle aufgeführten Aktionen hätten.

Aber ich denke nicht, dass Sie wirklich ein Design-spezifische Muster für diese folgen müssen. Sie können einfach einen Rückruf auf die Aktionen, um das Protokoll zu aktualisieren. Es hängt von Ihrer Architektur und Ihren Technologien ab, aber aus meinem Kopf klingt das Befehlsmuster wie Overkill.

+0

Danke, ich dachte an die Verwendung einfacher Callbacks, aber es scheint, dass es eine harte Zeit haben würde, den "Benutzer" aus der Anwendung zu bekommen, es sei denn, jede Aktion nimmt User als Argument auf. – Henry

1

Das Befehlsmuster klingt gut. Es ermöglicht Ihnen insbesondere, den Logger an den Befehl zu übergeben und den Befehl für den Logger auf dem Logger ausführen zu lassen. Auf diese Weise können Sie jede Aktion für die Formatierung des Protokolls selbst sorgen lassen, und wenn einige Aktionen nicht protokolliert werden sollten oder spezielle Informationen benötigen, müssen Sie Ihre gesamte Architektur nicht darüber informieren. Der Nachteil ist die Kopplung der Aktionen an den Logger, wenn Sie dies abwenden möchten, können Sie jeder Aktion eine Methode geben, die eine Log-Zeichenfolge zurückgibt, die hinzugefügt werden soll.

Wenn Sie eine Menge verschiedener Aktionen haben, denke ich nicht, dass dies zu viel ist, wenn das nur Datenbankaktionen sind und Sie das Datenbankframework Aktionen bei jeder Datenbankaktion durchführen können, muss das Rad neu erfunden werden Ein Logging-Mechanismus, aber wie marcgg zeigt, hängt von Ihrer Architektur ab.

4

Nicht das Kommando und das Protokoll Memento zusammenführen.

Der Befehl ist etwas, was gemacht wird. Dies kann einige allgemeine Aspekte für alle Befehle umfassen, einschließlich des Schreibens eines Protokolleintrags.

Der Protokolleintrag selbst kann ein Memento oder eine Zusammenfassung eines Memento sein.

Der Logger ist eine Art Fabrik, die protokollierten Ereignisse Mementos schafft.

Wie bei den meisten Dingen gibt es eine große Anzahl ineinandergreifender Entwurfsmuster. Welches "eine" Muster "am beliebtesten/am besten" ist, spielt keine Rolle.

Die Frage ist "was soll passieren?"

+5

als Referenz: "Das Memento-Muster ist ein Software-Design-Muster, das die Möglichkeit bietet, ein Objekt in seinen vorherigen Zustand wiederherzustellen" http://en.wikipedia.org/wiki/Memento_pattern – marcgg

4

Observer Pattern eignet sich gut für die Protokollierung von Framework. Sie können eine Logger-Klasse haben, die Observable erweitert, und untergeordnete Klassen wie Log in Konsole, Log in Datenbank und Log in Dateisystem etc. und jede Kindklasse implementiert Observer. Wenn nun eine Protokollnachricht protokolliert wird, werden alle in der Logger-Klasse registrierten Observer-Klassen benachrichtigt, sodass jede untergeordnete Klasse ex: log to console die Nachricht an der Konsole protokolliert. Die Logger-Klasse kann auch dem Singleton-Muster folgen, um sicherzustellen, dass eine einzelne Instanz von Logger über die gesamte Anwendung verfügbar ist.

+0

Ich habe dieses Muster für diesen Fall vor ein paar Jahren benutzt ... Das Logging funktioniert immer noch großartig. –

Verwandte Themen