2016-07-20 24 views
0

Ich benutze Log4j Syslog Appender und beachten Sie, dass der Appender, wenn eine Ausnahme auftritt, schreibt jeden Eintrag in der Stack-Trace als eine neue Zeile.Wie log4j Syslog Appender machen einen Stack-Trace in einer Zeile schreiben?

Gibt es eine Möglichkeit, es so zu konfigurieren, dass die gesamte Stack-Trace als eine Zeile statt mehrere Zeilen gehen?

+0

Ich bin mir nicht sicher, dass Sie das tun können, da ich nicht glaube, dass log4j das Stacktrace-Schreiben tatsächlich ausführt. Sie könnten es in eine Zeichenfolge schreiben und die Wagenrückläufe entfernen. – CodeChimp

+0

Was ist mit Pattern Layouts? – Joly

+0

Es sieht aus wie @davidhxx beantwortet Ihre Frage, aber mein Punkt war, dass ich unter dem Eindruck war, dass Log4J, und alle Logging-Utils einfach 'Throwable.printStackTrace()' verwendet, um die Stack-Trace auszugeben, und in diesem Fall würden Sie wahrscheinlich nicht Die Formatierung kann nicht einfach geändert werden. Es sieht jedoch so aus, als ob Log4J, wie die Antwort unten zeigt, irgendeine Art von Provision hat, um damit umzugehen. Ich vermute, dass es einen der überschriebenen 'printStackTrace()' Aufrufe benutzt, um die Werte in einen Stream/Writer zu schreiben ändere es. – CodeChimp

Antwort

1

Sie können den Renderer der Stacktraces anpassen. Es gibt zwei verfügbare ThrowableRenderer in Log4J (org.apache.log4j.spi.ThrowableRenderer Schnittstelle) Eins wird standardmäßig verwendet. Implementiert also Ihren eigenen ThrowableRenderer mit Ihrer gewünschten Formatierung und legt ihn dann in Ihrer Konfiguration fest.

In Log4j 1 funktioniert es. Versuchen Sie es nie in Log42. https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html

ThrowableRenderer Sie können die Art und Weise eine Instanz von Throwable anpassen angemeldet String umgewandelt wird, bevor sie. Dies geschieht durch Angabe eines ThrowableRenderer. Die Syntax lautet: log4j.throwableRenderer = fully.qualified.name.of.rendering.class log4j.throwableRenderer.paramName = paramValue Wie in, log4j.throwableRenderer = org.apache.log4j.EnhancedThrowableRenderer

+0

Danke, vergaß zu erwähnen, dass ich diese in JBOSS Fuse so sehr beschränkt, was ich Code-weise tun kann, nur in der Lage, Log4J Eigenschaften zu ändern. Gibt es Renderer, die ich bereits verwenden kann? – Joly

+0

Ich sehe nicht, warum Sie Ihre eigene Render-Klasse nicht erstellen und in den Klassenpfad von JBoss (z. B. das Lib-Verzeichnis) einfügen konnten. JBoss hat dieses Verzeichnis: common/lib. JBoss Sicherung hat das nicht? Es gibt zwei Renderer, aber sie machen nicht, was Sie wollen. DefaultThrowableRenderer und EnhancedThrowableRenderer. – davidxxx

0

Anstatt die Ausnahme nur an den Logger zu übergeben (z. B. log.error(e)), konvertieren Sie zuerst den Stack-Trace in einen String und protokollieren Sie den String.

Die meisten Uploads to this question haben ein paar einfache Möglichkeiten, die Stack-Trace in eine Zeichenfolge zu konvertieren.

+0

Es ist keine herkömmliche Art zu loggen. Sie können log.error (e) vergessen und den klassischen und gemeinsamen Weg aufrufen. Halten Sie gemeinsame Good Practices in der Softwareentwicklung wichtig. – davidxxx