From 10d57032d4ac9db70d784d716a450f1a46341cd6 Mon Sep 17 00:00:00 2001 From: Karsten Schnitter Date: Fri, 22 Apr 2022 09:28:59 +0200 Subject: [PATCH] Fix logback stacktrace information Since v3.6.0 the stacktrace feature was not working properly in the logback implementation. Amongst the missing information was the exception class, the exception message and suppressed or caused exceptions. The proposed change brings back the original coding used before v3.6.0, which is also used in the log4j2 implementation. Signed-off-by: Karsten Schnitter --- .../hcp/cf/logback/encoder/JsonEncoder.java | 14 +++++++--- .../sap/hcp/cf/logging/common/TestAppLog.java | 28 ++++++++----------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/cf-java-logging-support-logback/src/main/java/com/sap/hcp/cf/logback/encoder/JsonEncoder.java b/cf-java-logging-support-logback/src/main/java/com/sap/hcp/cf/logback/encoder/JsonEncoder.java index 9b07cfa8..45efe064 100644 --- a/cf-java-logging-support-logback/src/main/java/com/sap/hcp/cf/logback/encoder/JsonEncoder.java +++ b/cf-java-logging-support-logback/src/main/java/com/sap/hcp/cf/logback/encoder/JsonEncoder.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.OutputStream; +import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.InvocationTargetException; import java.nio.charset.Charset; @@ -14,6 +15,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import ch.qos.logback.classic.spi.IThrowableProxy; +import ch.qos.logback.classic.spi.ThrowableProxy; +import com.sap.hcp.cf.logging.common.converter.LineWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Marker; @@ -330,10 +334,12 @@ private Map collectContextFields(ILoggingEvent event) { private

void addStacktrace(ObjectComposer

oc, ILoggingEvent event) throws IOException, JsonProcessingException { - if (event.getThrowableProxy() != null) { - List lines = Stream.of(event.getThrowableProxy().getStackTraceElementProxyArray()).map( - StackTraceElementProxy::getSTEAsString) - .collect(Collectors.toList()); + IThrowableProxy proxy = event.getThrowableProxy(); + if (proxy != null && ThrowableProxy.class.isAssignableFrom(proxy.getClass())) { + Throwable throwable = ((ThrowableProxy) proxy).getThrowable(); + LineWriter lw = new LineWriter(); + throwable.printStackTrace(new PrintWriter(lw)); + List lines = lw.getLines(); StacktraceLines stacktraceLines = new StacktraceLines(lines); ArrayComposer> ac = oc.startArrayField(Fields.STACKTRACE); if (stacktraceLines.getTotalLineLength() <= maxStacktraceSize) { diff --git a/cf-java-logging-support-logback/src/test/java/com/sap/hcp/cf/logging/common/TestAppLog.java b/cf-java-logging-support-logback/src/test/java/com/sap/hcp/cf/logging/common/TestAppLog.java index 90a0aa11..a32a7173 100644 --- a/cf-java-logging-support-logback/src/test/java/com/sap/hcp/cf/logging/common/TestAppLog.java +++ b/cf-java-logging-support-logback/src/test/java/com/sap/hcp/cf/logging/common/TestAppLog.java @@ -1,10 +1,9 @@ package com.sap.hcp.cf.logging.common; import static com.sap.hcp.cf.logging.common.converter.CustomFieldMatchers.hasCustomField; +import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.hamcrest.Matchers.lessThanOrEqualTo; +import static org.hamcrest.Matchers.*; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; @@ -122,20 +121,17 @@ public void testCustomFieldOverwritesMdc() throws Exception { assertThat(getField(SOME_KEY), is(SOME_OTHER_VALUE)); } - @Test + @Test public void testStacktrace() { - try { - Double.parseDouble(null); - } catch (Exception ex) { - logMsg = "Running testStacktrace()"; - LOGGER.error(logMsg, ex); - assertThat(getMessage(), is(logMsg)); - assertThat(getField(Fields.COMPONENT_ID), is("-")); - assertThat(getField(Fields.COMPONENT_NAME), is("-")); - assertThat(getField(Fields.COMPONENT_INSTANCE), is("0")); - assertThat(getField(Fields.STACKTRACE), is(notNullValue())); - assertThat(getField(Fields.WRITTEN_TS), is(notNullValue())); - } + logMsg = "Running testStacktrace()"; + Exception testEx = new Exception("Test-case for Stacktraces."); + LOGGER.error(logMsg, testEx); + assertThat(getMessage(), is(logMsg)); + assertThat(getField(Fields.COMPONENT_ID), is("-")); + assertThat(getField(Fields.COMPONENT_NAME), is("-")); + assertThat(getField(Fields.COMPONENT_INSTANCE), is("0")); + assertThat(getField(Fields.STACKTRACE), stringContainsInOrder(asList("java.lang.Exception", "Test-case for Stacktraces."))); + assertThat(getField(Fields.WRITTEN_TS), is(notNullValue())); } @Test