Frage

Ich habe eine geschichtete Anwendung in Java, die eine Multi-Thread Datenzugriffsschicht aufweist, die von verschiedenen Punkten aufgerufen wird. Ein einzelner Aufruf diese Schicht wird wahrscheinlich mehrere Threads zum Laichen Anfragen an die DB parallelisieren.

Was ich suche ist ein Logging-Tool, das mir erlauben würde, „Aktivitäten“ zu definieren, die von verschiedenen Fäden zusammengesetzt sind. Daher soll das gleiche Verfahren, das in der Datenzugriffsschicht verschiedene Ausgänge anmelden ihren Aufrufer abhängig. Die Fähigkeit zur Gruppe verschiedene Ausgänge, die Gesamtkosten einer Operation zusammenzufassen ist ebenfalls wichtig.

Auch wenn die Anwendung in Java ist, die Sprache ist keine Einschränkung; was ich brauche sind die Design-Richtlinien so, um schließlich es umzusetzen. Wir sind derzeit log4j, sondern können dieses Verhalten nicht von ihm bekommen.

War es hilfreich?

Lösung

Sie sollten auch einen Blick auf die haben verschachtelt diagnostischen Kontext Merkmal log4j. Pushing verschiedenen Kontexten an den Logger für verschiedene Anrufer könnte den Trick für Sie tun.

Andere Tipps

Sie sollten einen Logger übergeben um der Lage sein, so dass Sie einen Logger erstellen basierend auf einigen „gemeinsamen“ für die Aufgabendaten - das heißt Benutzername, usw. Dann geben Sie diesen Logger als Parameter für alle Methoden, die Sie benötigen. Auf diese Weise werden Sie in der Lage sein, verschiedene Filter zu setzen und / oder Regeln in Ihrer log4j Konfigurationsdatei. Oder die Ausgabedatei zu kratzen, basierend auf dem Logger Namen.

EDIT: Prüfen Sie auch, MDC und NDC-Klassen in log4j. Sie können dort Kontextdaten hinzufügen.

In log4j können Sie den Thread-Namen einloggen mit dem "% t" Muster. Siehe log4j Musterlayout .

In einem meiner (Web-) Anwendungen, verwende ich eine Threadlogger, der Logging-Informationen in einen String einfängt. Das Logger-Objekt wird in der # Service-Methode HttpServlet initialisiert, wenn eine Spur Parameter gesetzt ist (wenn es nicht gesetzt ist, gibt es einen sehr schnellen Null-Logger). Die resultierende Ausgabe wird entweder als HTML-Kommentar in die anfordernden Seite abgeladen oder in einem Segment in eine Protokolldatei geschrieben.

In Java5 (und höher) können Sie anrufen

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

Überprüfen Sie die Stack-Trace, was auch immer Sie wollen, Tiefe und entsprechend anmelden.

In Java 1.4 Sie können mit den gleichen Informationen bekommen

StackTraceElement[] stackTrace = new Exception().getStackTrace();

Sie wollen Logger Objekte mit Fäden verknüpfen, denke ich. Ein Thread Variable eine log4j-Logger-Instanz für jeden Thread halten könnte helfen:

http://java.sun.com /javase/6/docs/api/java/lang/ThreadLocal.html

Sie müssen eine gewisse Struktur zu der Datenzugriffsschicht zu übergeben, die die aktuelle „Aktivität“ bezeichnet. Vielleicht haben Sie bereits eine „Aktivität“ haben -Klasse das Sinn macht, haben Sie vielleicht eine Logger-Instanz: Sunny vorgeschlagen oder Sie könnten eine dritte Struktur verwenden Spur des aktivitäts Kontextes zu halten.

Auf jeden Fall, da Ihre „Aktivität“ wird über mehrere Threads verarbeitet nicht Thread-local-Speicher für die Verfolgung der aktuellen „Aktivität“ verwenden können, wie die meisten anderen aktuellen Antworten vorschlagen. Sie werden es um explizit müssen passieren.

Ich würde vorschlagen, eine kleine Fassade auf der log4j zu machen, die die Schnittstelle mit Methoden wie

erweitert
void debug(Activity activity, String message);

und das Bestehen des aktivitäts Kontextes in diesen von der Datenzugriffsschicht.

Sie müssen einige Änderungen an der Datenzugriffsschicht, damit Sie die aktuelle Aktivität, um es passieren zu lassen, aber wie man am besten auf die aktuelle Schnittstelle das hängt stark zu tun. Wenn Sie die Workspace-Muster verwenden, müssen Sie nur eine setActivity () -Methode auf der Workspace-Klasse hinzuzufügen, aber auch andere Interface-Muster können Sie benötigen einen Aktivitätsparameter für alle Methoden hinzuzufügen.

Wenn Sie aus irgendeinem Grund nicht in der Lage oder nicht willens ist, die Datenzugriffsschicht zu ändern, könnte man natürlich speichern die aktivitäts Kontext in lokalen Threadspeicher, bevor Sie die Datenzugriffsschicht aufgerufen wird, und rufen Sie sie kurz vor der Unter Themen Laichen oder Enqueing der Aufträge in der Datenzugriffsschicht. Das ist eine praktikable Lösung, aber es ist ein bisschen gefährlich Informationen um auf diese Weise zu übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top