2013-05-29 9 views
5

Ich habe ein Protokollierungsmechanismus Setup mit Slf4j und java.util.Logging. Ich habe mehrere Threads, daher kann ich keine klare Idee von den Logs bekommen, da sie gemischt sind. Jetzt versuche ich MDC Konzept zu verwenden, um einige weitere Daten mit der Protokolldatei hinzuzufügen, damit sie klar sind.Unterstützung für MDC (Mapped Diagnostic Context) für JUL (Java.util.Logging)

Problem ist wie in Slf4j obwohl MDC unterstützt java.util.Logging nicht. Aber es sagt

Wenn der zugrunde liegende Framework nicht MDC bieten, zum Beispiel java.util.logging, dann wird SLF4J noch MDC Daten speichern, sondern die darin enthaltenen Informationen müssen durch individuellen Benutzercode abgerufen werden.

Ich versuche, einen Weg zu finden, diesen benutzerdefinierten Code zu tun. Googeln hilft mir nicht viel. Es gibt eine Hilfsklasse in Slf4j namens "BasicMDCAdapter". Aber ich weiß nicht, wie ich es benutzen soll. Ich konnte nirgendwo einen Beispielcode finden.

This ist auch ein Code, der dabei hilft, aber noch nicht ein bisschen Beschreibung gibt.

Ich schätze eine Hilfe von jemandem hier.

Vielen Dank.

+0

Ich hasse es, die Antwort zu geben "versuchen Sie etwas anderes", aber ... Haben Sie versucht, mit Logback? Es ist ein Logger speziell für die Unterstützung von slf4j und es hat MDC-Unterstützung. '
ch.qos.logback
logback-classic
0.9.30


ch.qos.logback
logback-Kern
0.9.30
'

Antwort

6

Je nachdem, was Sie erreichen möchten, können Sie möglicherweise benutzerdefinierten Code überhaupt vermeiden.

Verwenden Sie den Juli zu SLF4J Brücke

Das ist eine Brücke zur Verfügung, die in java.util.logging (Juli) hakt und leitet alle Protokollereignisse SLF4J. Die Verwendung der Protokollausgabe ermöglicht die Verwendung einer beliebigen SLF4J-Protokollimplementierung (z. B. Logback oder Log4j) zum Schreiben der kombinierten Protokollausgabe für beide Protokollierungs-APIs.

Mit der JUL zu SLF4J Bridge erhalten Sie MDC-Unterstützung kostenlos mit jeder SLF4J-Implementierung, die es unterstützt.

schreiben Juli Erweiterung

Wenn Sie dann getrennt die Protokollierungssysteme behalten möchten würden Sie eine Erweiterung Juli schreiben müssen, die „liest“ die MDC und Ausgangs seine Werte in das Protokoll. Wenn Sie in die Klasse SLF4J MDC schauen, hat es eine Methode für den Zugriff auf alle seine Werte: org.slf4j.MDC.getCopyOfContextMap().

Beachten Sie, dass die Standard-JUL-Handler sehr begrenzt sind. Daher denke ich, dass Sie Ihre eigenen implementieren müssten, die dann auf das MDC zugreifen könnten. Sie müssen jedoch zunächst überprüfen, ob sie aus demselben Thread aufgerufen werden.