Frage

Wir haben eine weblogic-batch-Anwendung, die Prozesse, die mehrere Anforderungen von Verbrauchern an der gleichen Zeit.Wir verwenden log4j für die Protokollierung Zwecken.Jetzt loggen wir uns auf eine einzelne log-Datei für mehrere Anforderungen.Es wird mühsam zu Debuggen, die ein Problem für eine bestimmte Anforderung für alle Anfragen die Protokolle werden in einer einzigen Datei.

So ist geplant eine log-Datei pro Anfrage.Der Verbraucher sendet eine request-ID, für die Bearbeitung durchgeführt werden.Nun, in der Realität kann es mehrere Verbraucher Absenden der Anfrage-IDs zu unserer Anwendung.Also Frage ist, wie seggregate die log-Dateien basieren auf der Anforderung.

Wir können nicht starten & stoppen die Produktion server jedes mal, so dass der Punkt mit eine überschriebene Datei-appender mit Datums - / Zeitstempel oder die Anfrage-ID ist ausgeschlossen.Dies ist, was erklärt ist, die folgenden Artikel:http://veerasundar.com/blog/2009/08/how-to-create-a-new-log-file-for-each-time-the-application-runs/

Ich habe auch versucht, das Spiel mit diesen alternativen:

http://cognitivecache.blogspot.com/2008/08/log4j-writing-to-dynamic-log-file-for.html

http://www.mail-archive.com/log4j-user@logging.apache.org/msg05099.html

Dieser Ansatz gibt die gewünschten Ergebnisse, aber es funktioniert nicht korrekt, wenn mehrere Anforderungen gesendet werden zur gleichen Zeit.Aufgrund einige Parallelitätsprobleme logs mal hier, mal da.

Erwarte ich etwas Hilfe von Euch Leute.Vielen Dank im Voraus....

War es hilfreich?

Lösung

Hier ist meine Frage zum gleichen Thema: dynamische Erstellung und Protokollierung zu zerstören Appen

ich das an einem Faden folgen, wo ich etwas genau so diskutieren zu tun, auf der Log4J Mailingliste: http://www.qos.ch/pipermail/logback- Benutzer / 2009-August / 001220.html

Ceci Gülcü (Erfinder von log4j) nicht glaube, es war eine gute Idee ... vorgeschlagen mit Logback statt.

Wir gingen weiter und tat dies jedenfalls eine benutzerdefinierte Datei appender verwenden. Siehe meine Diskussionen oben für weitere Details.

Andere Tipps

Schauen SiftingAppender Versand mit logback (log4j ' s Nachfolger), es ist entworfen, um die Erstellung von appenders auf runtime-Kriterien.

Wenn Sie die Anwendung erstellt werden muss, nur eine log-Datei pro Sitzung, erstellen Sie einfach einen Diskriminator, basierend auf der Sitzungs-id.Schreiben Sie einen Diskriminator beinhaltet 3 oder 4 Zeilen von code und somit sollten ziemlich einfach sein.Schrei auf die logback-user mailing-Liste, wenn Sie Hilfe benötigen.

Dieses Problem ist sehr gut behandelt von Logback . Ich schlage vor, dafür zu entscheiden, wenn Sie die Freiheit haben.

Unter der Annahme, können Sie, was Sie Gebrauch benötigen, ist SiftingAppender . Es ermöglicht Ihnen, Protokolldateien nach einigem Laufzeitwert zu trennen. Was bedeutet, dass Sie haben eine breite Palette von Möglichkeiten, wie Log-Dateien zu teilen.

Ihre Dateien auf requestId So teilen Sie so etwas tun könnte:

logback.xml

<configuration>

  <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
      <key>requestId</key>
      <defaultValue>unknown</defaultValue>
    </discriminator>
    <sift>
      <appender name="FILE-${requestId}" class="ch.qos.logback.core.FileAppender">
        <file>${requestId}.log</file>
        <append>false</append>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
        </layout>
      </appender>
    </sift>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="SIFT" />
  </root>

</configuration>

Wie Sie (innerhalb discriminator Element) sehen können, Sie die Dateien verwendet diskriminieren wollen für Protokolle auf requestId zu schreiben. Das bedeutet, dass jede Anforderung in einer Datei gehen, die einen entsprechenden requestId hat. Daher, wenn Sie hatten zwei Anfragen, bei denen requestId=1 und eine Anforderung, wo requestId=2 Sie 2 Logfiles haben würde: 1.log (2 Einträge) und 2.log (1 Eintrag).

An diesem Punkt könnte man sich fragen, wie die key einzustellen. Dies geschieht, indem Schlüssel-Wert-Paare in MDC (beachten Sie, dass Schlüssel, die man in logback.xml Datei definiert wird, entspricht):

RequestProcessor.java

public class RequestProcessor {

    private static final Logger log = LoggerFactory.getLogger(RequestProcessor.java);

    public void process(Request request) {
        MDC.put("requestId", request.getId());
        log.debug("Request received: {}", request);
    }
}

Und das ist im Grunde ist es für einen einfachen Anwendungsfall. Jetzt jedes Mal eine Anfrage mit einem anderen (noch nicht begegnet) id kommt, wird eine neue Datei für sie erstellt werden.

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