From 06b47a80a61ed4b31f82cf59cf90bca36d26445b Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Tue, 21 Jan 2014 21:11:18 +1100 Subject: [PATCH] Make sure the logback appender sends the entire exception message to the gelf server. --- CHANGELOG.md | 5 ++++ .../java/gelf4j/logback/GelfAppender.java | 28 ++++++++++++++++++- .../java/gelf4j/logback/GelfAppenderTest.java | 20 +++++++++++-- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 221433a..efd0c2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.8: + +* Fix : Make sure the logback appender sends the entire exception message to the + gelf server. + ## 1.7: * Enhance : Generate the Maven POM from buildr. diff --git a/src/main/java/gelf4j/logback/GelfAppender.java b/src/main/java/gelf4j/logback/GelfAppender.java index 2145065..8e8789b 100644 --- a/src/main/java/gelf4j/logback/GelfAppender.java +++ b/src/main/java/gelf4j/logback/GelfAppender.java @@ -146,7 +146,9 @@ else if( GelfTargetConfig.FIELD_EXCEPTION.equals( fieldName ) ) final IThrowableProxy proxy = event.getThrowableProxy(); if( null != proxy ) { - GelfMessageUtil.setValue( message, key, toStackTraceString( proxy.getStackTraceElementProxyArray() ) ); + final StringBuilder sb = new StringBuilder(); + collectExceptionMessage( proxy, sb ); + GelfMessageUtil.setValue( message, key, sb.toString() ); } } else if( null != mdc ) @@ -163,6 +165,30 @@ else if( null != mdc ) return message; } + private void collectExceptionMessage( final IThrowableProxy proxy, final StringBuilder sb ) + { + sb.append( proxy.getClassName() ); + final String m = proxy.getMessage(); + if( null != m ) + { + sb.append( ": " ); + sb.append( m ); + } + sb.append( "\n" ); + for ( final StackTraceElementProxy element : proxy.getStackTraceElementProxyArray() ) + { + sb.append( "\t" ); + sb.append( element.getSTEAsString() ); + sb.append( "\n" ); + } + final IThrowableProxy cause = proxy.getCause(); + if( null != cause ) + { + sb.append( "Caused by: " ); + collectExceptionMessage( cause, sb ); + } + } + private String toStackTraceString( final StackTraceElementProxy[] elements ) { final StringBuilder str = new StringBuilder(); diff --git a/src/test/java/gelf4j/logback/GelfAppenderTest.java b/src/test/java/gelf4j/logback/GelfAppenderTest.java index a268184..ba19bc3 100644 --- a/src/test/java/gelf4j/logback/GelfAppenderTest.java +++ b/src/test/java/gelf4j/logback/GelfAppenderTest.java @@ -127,8 +127,24 @@ public void configureSetsUpLoggerCorrectly() logger.error( smallTextMessage, new Exception() ); assertTrue( ConnectionUtil.receivePacketAsString( socket ).contains( smallTextMessage ) ); message = connection.getLastMessage(); - assertEquals( SyslogLevel.ERR, message.getLevel() ); - assertNotNull( message.getAdditionalFields().get( "exception" ) ); + { + assertEquals( SyslogLevel.ERR, message.getLevel() ); + final String exception = (String) message.getAdditionalFields().get( "exception" ); + assertNotNull( exception ); + assertTrue( exception.contains( "java.lang.Exception\n" ) ); + assertTrue( exception.contains( "\tat gelf4j.logback.GelfAppenderTest.configureSetsUpLoggerCorrectly(" ) ); + } + + logger.error( smallTextMessage, new Exception( "MyError", new IllegalStateException() ) ); + assertTrue( ConnectionUtil.receivePacketAsString( socket ).contains( smallTextMessage ) ); + message = connection.getLastMessage(); + { + assertEquals( SyslogLevel.ERR, message.getLevel() ); + final String exception = (String) message.getAdditionalFields().get( "exception" ); + assertNotNull( exception ); + assertTrue( exception.contains( "java.lang.Exception: MyError\n" ) ); + assertTrue( exception.contains( "Caused by: java.lang.IllegalStateException\n" ) ); + } // Force the closing of the appender context.reset();