diff --git a/src/main/java/com/logentries/log4j/LogentriesAppender.java b/src/main/java/com/logentries/log4j/LogentriesAppender.java index 8183660..5f0cb28 100644 --- a/src/main/java/com/logentries/log4j/LogentriesAppender.java +++ b/src/main/java/com/logentries/log4j/LogentriesAppender.java @@ -152,22 +152,41 @@ protected void append( LoggingEvent event) { // Append stack trace if present and layout does not handle it if (layout.ignoresThrowable()) { String[] stack = event.getThrowableStrRep(); - if (stack != null) - { - int len = stack.length; - formattedEvent += ", "; - for(int i = 0; i < len; i++) - { - formattedEvent += stack[i]; - if(i < len - 1) - formattedEvent += "\u2028"; - } - } + if (stack != null && stack.length > 0) + formattedEvent = appendFormatedEvent(formattedEvent, stack); } // Prepare to be queued this.le_async.addLineToQueue(formattedEvent); } + private static final String EXCEPTION_SEPARATOR = ", "; + + static String appendFormatedEvent(final String formattedEvent, final String[] stack) { + final int len = stack.length; + + // calculate buffer size + int buffSize = formattedEvent.length() + + EXCEPTION_SEPARATOR.length() + + len - 1 + ; + for (int i = 0; i < len; i++) { + buffSize += stack[i].length(); + } + + // concatenate + final StringBuilder sb = new StringBuilder(buffSize); + sb.append(formattedEvent); + sb.append(EXCEPTION_SEPARATOR); + + for (int i = 0; i < len; i++) { + sb.append(stack[i]); + if (i < len - 1) { + sb.append('\u2028'); + } + } + // assert sb.capacity() == sb.length(); + return sb.toString(); + } /** * Closes all connections to Logentries diff --git a/src/test/java/com/logentries/log4j/LogentriesAppenderTest.java b/src/test/java/com/logentries/log4j/LogentriesAppenderTest.java index 064ff45..450b49f 100644 --- a/src/test/java/com/logentries/log4j/LogentriesAppenderTest.java +++ b/src/test/java/com/logentries/log4j/LogentriesAppenderTest.java @@ -1,5 +1,6 @@ package com.logentries.log4j; +import static com.logentries.log4j.LogentriesAppender.*; import static org.junit.Assert.*; import org.junit.Test; @@ -26,4 +27,8 @@ public void settersTest() { assertEquals(le.le_async.getSsl(),true); } + @Test + public void testAppendFormatedEvent() { + assertEquals("foo, a\u2028b\u2028c", appendFormatedEvent("foo", new String[]{"a","b", "c"})); + } }