Anmeldung in Multi-Thread-Anwendung in Java

8

Was ist das beste und beste Werkzeug für die Anmeldung in einer Umgebung mit mehreren Threads, so dass jeder Thread über eine eigene Logger-Instanz und eine separate Datei verfügt? ist das überhaupt möglich?

    
mabuzer 24.06.2010, 10:35
quelle

3 Antworten

6

Sie können versuchen, einen benutzerdefinierten Log4J-Appender zu verwenden, der die Thread-ID als Parameter verwendet und Nachrichten basierend darauf filtert, welcher Thread sie aufruft. Erstellen Sie es im laufenden Betrieb, hängen Sie es an den Logger an.

Es gibt jedoch mehrere Probleme mit diesem Ansatz:

  1. Zu viele Appender verlangsamen die Protokollierung
  2. AppServer haben normalerweise einen Thread-Pool. Das bedeutet, dass derselbe Thread im Laufe der Zeit an der Ausführung von völlig unabhängigen Anfragen teilnehmen würde, die in derselben Protokolldatei landen.

Ich schlage vor, dass Sie einen einfacheren Ansatz in Erwägung ziehen: Protokollieren Sie die Thread-ID in dieselbe Protokolldatei. Es ist schnell und einfach, Log4j hat eine% -Flag dafür. Später können Sie die Protokolldatei je nach Thread-ID grep / splitten.

Aktualisieren :

Tatsächlich haben Sie vielleicht einen einzigen benutzerdefinierten Appender, der Log-Dateien bei Bedarf öffnet, wenn ein neuer Thread einen Datensatz protokolliert (der Appender wird innerhalb dieses Thread-Kontexts ausgeführt, rufen Sie einfach Thread.currentThread (). getName ()). Aber Sie müssen alle üblichen Protokolldateiaufgaben (Rotation) neu implementieren oder für jede Datei an den Standardappender delegieren.

    
Vladimir Dyuzhev 24.06.2010, 10:57
quelle
4

Ich habe eine Multithread-Anwendung, die jeden Thread in der Protokolldatei identifiziert (weiß nicht über mehrere Dateien, einzelne Datei zeigt mir Übereinstimmung), identifiziert den Thread automatisch durch das Protokollierungsframework, es ist Log4J

Bearbeiten: Es muss nichts im Code hinzugefügt werden. Sie müssen nur den Appender im Logger so konfigurieren, dass er [% Thread] enthält, um den Thread zu identifizieren, von dem aus Sie die aktuelle Nachricht protokollieren Beispiel stammt von log4net:

%Vor%

Hier finden Sie eine Liste anderer gängiger Java-Protokollierungs-Frameworks

    
GenEric35 24.06.2010 10:51
quelle
0

In manchen Fällen ist es weniger wichtig, die Thread-Kennung zu kennen, als den Kontext der Ausführung zu kennen. Dies trifft insbesondere auf viele Threads und größere Anwendungen zu. Was tun Sie, wenn sich die Thread-ID ändert, der tatsächliche Ausführungskontext jedoch tatsächlich derselbe ist (wie jemand, der in den Thread-Pools erwähnt wird)? Ich würde lieber MDC (zugeordneten Diagnosekontext) verwenden, um die Ausführungskontext in Protokollen. Es ist besser, weil Sie kontrollieren, was der Kontext ist. Am Ende können Sie das Layout von Protokollen so einstellen, dass es MDC enthält und dann leicht herausfiltern, was relevant ist. Schauen Sie sich dieses Tool an, es macht eine Menge Dinge mit MDC.

    
Dima 26.06.2010 07:09
quelle

Tags und Links