From 6fafbf592a8d97f66c3a32ce3ea343695fa19fda Mon Sep 17 00:00:00 2001 From: Darius Date: Fri, 5 Aug 2016 14:06:41 -0400 Subject: [PATCH 1/2] CAMEL-10210: Trace formatter support for multiline --- .../camel/management/mbean/ManagedTracer.java | 15 ++++ .../interceptor/DefaultTraceFormatter.java | 84 +++++++++++++++++-- .../DefaultTraceFormatterTest.java | 4 + 3 files changed, 95 insertions(+), 8 deletions(-) diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java index 1b9fe9d281d2a..5f3d0fa654e54 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java @@ -265,6 +265,21 @@ public void setFormatterShowProperties(boolean showProperties) { tracer.getDefaultTraceFormatter().setShowProperties(showProperties); } + public boolean getFormatterMultiline() { + if (tracer.getDefaultTraceFormatter() == null) { + return false; + } + return tracer.getDefaultTraceFormatter().isMultiline(); + } + + public void setFormatterMultiline(boolean multiline) { + if (tracer.getDefaultTraceFormatter() == null) { + return; + } + tracer.getDefaultTraceFormatter().setMultiline(multiline); + } + + public boolean getFormatterShowNode() { if (tracer.getDefaultTraceFormatter() == null) { return false; diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceFormatter.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceFormatter.java index c0ac540911955..23a7cb01e1fed 100644 --- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceFormatter.java +++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceFormatter.java @@ -29,6 +29,10 @@ * @version */ public class DefaultTraceFormatter implements TraceFormatter { + + protected static final String LS = System.getProperty("line.separator"); + private static final String SEPARATOR = "###REPLACE_ME###"; + private int breadCrumbLength; private int nodeLength; private boolean showBreadCrumb = true; @@ -45,6 +49,8 @@ public class DefaultTraceFormatter implements TraceFormatter { private boolean showOutBodyType; private boolean showException = true; private boolean showRouteId = true; + private boolean multiline; + private int maxChars = 10000; public Object format(final TraceInterceptor interceptor, final ProcessorDefinition node, final Exchange exchange) { @@ -55,50 +61,104 @@ public Object format(final TraceInterceptor interceptor, final ProcessorDefiniti } StringBuilder sb = new StringBuilder(); + if (multiline) { + sb.append(SEPARATOR); + } sb.append(extractBreadCrumb(interceptor, node, exchange)); if (showExchangePattern) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Pattern:").append(exchange.getPattern()); } // only show properties if we have any if (showProperties && !exchange.getProperties().isEmpty()) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Properties:").append(exchange.getProperties()); } // only show headers if we have any if (showHeaders && !in.getHeaders().isEmpty()) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Headers:").append(in.getHeaders()); } if (showBodyType) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", BodyType:").append(MessageHelper.getBodyTypeName(in)); } if (showBody) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Body:").append(MessageHelper.extractBodyForLogging(in, "")); } if (showOutHeaders && out != null) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", OutHeaders:").append(out.getHeaders()); } if (showOutBodyType && out != null) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", OutBodyType:").append(MessageHelper.getBodyTypeName(out)); } if (showOutBody && out != null) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", OutBody:").append(MessageHelper.extractBodyForLogging(out, "")); } if (showException && exchange.getException() != null) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Exception:").append(exchange.getException()); } // replace ugly <<<, with <<< - String s = sb.toString(); - s = s.replaceFirst("<<<,", "<<<"); - + sb = new StringBuilder(sb.toString().replaceFirst("<<<,", "<<<")); + if (maxChars > 0) { - if (s.length() > maxChars) { - s = s.substring(0, maxChars) + "..."; + StringBuilder answer = new StringBuilder(); + for (String s : sb.toString().split(SEPARATOR)) { + if (s != null) { + if (s.length() > maxChars) { + s = s.substring(0, maxChars); + answer.append(s).append("..."); + } else { + answer.append(s); + } + if (multiline) { + answer.append(LS); + } + } } - return s; - } else { - return s; + + // switch string buffer + sb = answer; } + +// if (multiline) { +// sb.insert(0, "Exchange["); +// sb.append("]"); +// } else { +// // get rid of the leading space comma if needed +// if (sb.length() > 0 && sb.charAt(0) == ',' && sb.charAt(1) == ' ') { +// sb.replace(0, 2, ""); +// } +// sb.insert(0, "Exchange["); +// sb.append("]"); +// } + + return sb.toString(); } public boolean isShowBody() { @@ -205,6 +265,14 @@ public void setShowRouteId(boolean showRouteId) { this.showRouteId = showRouteId; } + public boolean isMultiline() { + return multiline; + } + + public void setMultiline(boolean multiline) { + this.multiline = multiline; + } + public int getBreadCrumbLength() { return breadCrumbLength; } diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DefaultTraceFormatterTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DefaultTraceFormatterTest.java index e1993ce8ea287..1ee5ee563c557 100644 --- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DefaultTraceFormatterTest.java +++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DefaultTraceFormatterTest.java @@ -18,6 +18,7 @@ import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; +import org.apache.camel.LoggingLevel; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; @@ -149,6 +150,9 @@ private DefaultTraceFormatter getFormatter() { formatter.setShowProperties(true); assertEquals(true, formatter.isShowProperties()); + + formatter.setMultiline(true); + assertEquals(true, formatter.isMultiline()); formatter.setShowShortExchangeId(true); assertEquals(true, formatter.isShowShortExchangeId()); From ac1c109685056d084d1618a3b6522cb20e794ec6 Mon Sep 17 00:00:00 2001 From: Darius Date: Fri, 5 Aug 2016 14:06:41 -0400 Subject: [PATCH 2/2] CAMEL-10210: Trace formatter support for multiline --- .../camel/management/mbean/ManagedTracer.java | 15 ++++ .../interceptor/DefaultTraceFormatter.java | 72 ++++++++++++++++--- .../DefaultTraceFormatterTest.java | 4 ++ 3 files changed, 83 insertions(+), 8 deletions(-) diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java index 1b9fe9d281d2a..5f3d0fa654e54 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedTracer.java @@ -265,6 +265,21 @@ public void setFormatterShowProperties(boolean showProperties) { tracer.getDefaultTraceFormatter().setShowProperties(showProperties); } + public boolean getFormatterMultiline() { + if (tracer.getDefaultTraceFormatter() == null) { + return false; + } + return tracer.getDefaultTraceFormatter().isMultiline(); + } + + public void setFormatterMultiline(boolean multiline) { + if (tracer.getDefaultTraceFormatter() == null) { + return; + } + tracer.getDefaultTraceFormatter().setMultiline(multiline); + } + + public boolean getFormatterShowNode() { if (tracer.getDefaultTraceFormatter() == null) { return false; diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceFormatter.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceFormatter.java index c0ac540911955..a02c3da36dd09 100644 --- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceFormatter.java +++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultTraceFormatter.java @@ -29,6 +29,10 @@ * @version */ public class DefaultTraceFormatter implements TraceFormatter { + + protected static final String LS = System.getProperty("line.separator"); + private static final String SEPARATOR = "###REPLACE_ME###"; + private int breadCrumbLength; private int nodeLength; private boolean showBreadCrumb = true; @@ -45,6 +49,8 @@ public class DefaultTraceFormatter implements TraceFormatter { private boolean showOutBodyType; private boolean showException = true; private boolean showRouteId = true; + private boolean multiline; + private int maxChars = 10000; public Object format(final TraceInterceptor interceptor, final ProcessorDefinition node, final Exchange exchange) { @@ -55,50 +61,92 @@ public Object format(final TraceInterceptor interceptor, final ProcessorDefiniti } StringBuilder sb = new StringBuilder(); + if (multiline) { + sb.append(SEPARATOR); + } sb.append(extractBreadCrumb(interceptor, node, exchange)); if (showExchangePattern) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Pattern:").append(exchange.getPattern()); } // only show properties if we have any if (showProperties && !exchange.getProperties().isEmpty()) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Properties:").append(exchange.getProperties()); } // only show headers if we have any if (showHeaders && !in.getHeaders().isEmpty()) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Headers:").append(in.getHeaders()); } if (showBodyType) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", BodyType:").append(MessageHelper.getBodyTypeName(in)); } if (showBody) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Body:").append(MessageHelper.extractBodyForLogging(in, "")); } if (showOutHeaders && out != null) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", OutHeaders:").append(out.getHeaders()); } if (showOutBodyType && out != null) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", OutBodyType:").append(MessageHelper.getBodyTypeName(out)); } if (showOutBody && out != null) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", OutBody:").append(MessageHelper.extractBodyForLogging(out, "")); } if (showException && exchange.getException() != null) { + if (multiline) { + sb.append(SEPARATOR); + } sb.append(", Exception:").append(exchange.getException()); } // replace ugly <<<, with <<< - String s = sb.toString(); - s = s.replaceFirst("<<<,", "<<<"); - + sb = new StringBuilder(sb.toString().replaceFirst("<<<,", "<<<")); + if (maxChars > 0) { - if (s.length() > maxChars) { - s = s.substring(0, maxChars) + "..."; + StringBuilder answer = new StringBuilder(); + for (String s : sb.toString().split(SEPARATOR)) { + if (s != null) { + if (s.length() > maxChars) { + s = s.substring(0, maxChars); + answer.append(s).append("..."); + } else { + answer.append(s); + } + if (multiline) { + answer.append(LS); + } + } } - return s; - } else { - return s; + + // switch string buffer + sb = answer; } + + return sb.toString(); } public boolean isShowBody() { @@ -205,6 +253,14 @@ public void setShowRouteId(boolean showRouteId) { this.showRouteId = showRouteId; } + public boolean isMultiline() { + return multiline; + } + + public void setMultiline(boolean multiline) { + this.multiline = multiline; + } + public int getBreadCrumbLength() { return breadCrumbLength; } diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DefaultTraceFormatterTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DefaultTraceFormatterTest.java index e1993ce8ea287..1ee5ee563c557 100644 --- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DefaultTraceFormatterTest.java +++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DefaultTraceFormatterTest.java @@ -18,6 +18,7 @@ import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; +import org.apache.camel.LoggingLevel; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; @@ -149,6 +150,9 @@ private DefaultTraceFormatter getFormatter() { formatter.setShowProperties(true); assertEquals(true, formatter.isShowProperties()); + + formatter.setMultiline(true); + assertEquals(true, formatter.isMultiline()); formatter.setShowShortExchangeId(true); assertEquals(true, formatter.isShowShortExchangeId());