You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ck...@apache.org on 2018/04/24 13:40:04 UTC

[4/8] logging-log4j2 git commit: [LOG4J2-2320] Fix NPE in AbstractLogger when another exception is thrown

[LOG4J2-2320] Fix NPE in AbstractLogger when another exception is thrown

This bug hides the original cause of the failure.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/3e6503fb
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/3e6503fb
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/3e6503fb

Branch: refs/heads/release-2.x
Commit: 3e6503fbdb162e3a3d6e30660363ebed1b5710a9
Parents: e228704
Author: Carter Kozak <ck...@apache.org>
Authored: Tue Apr 17 14:43:11 2018 -0400
Committer: Carter Kozak <ck...@apache.org>
Committed: Tue Apr 24 09:18:04 2018 -0400

----------------------------------------------------------------------
 .../logging/log4j/spi/AbstractLogger.java       |  3 +-
 .../logging/log4j/AbstractLoggerTest.java       | 81 ++++++++++++++++++++
 2 files changed, 83 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3e6503fb/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
index 012dcca..5b6ac1a 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
@@ -2181,7 +2181,8 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable {
             throw (LoggingException) exception;
         }
         final String format = msg.getFormat();
-        final StringBuilder sb = new StringBuilder(format.length() + 100);
+        final int formatLength = format == null ? 4 : format.length();
+        final StringBuilder sb = new StringBuilder(formatLength + 100);
         sb.append(fqcn);
         sb.append(" caught ");
         sb.append(exception.getClass().getName());

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3e6503fb/log4j-api/src/test/java/org/apache/logging/log4j/AbstractLoggerTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/AbstractLoggerTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/AbstractLoggerTest.java
index f4800fe..a152aad 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/AbstractLoggerTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/AbstractLoggerTest.java
@@ -16,12 +16,15 @@
  */
 package org.apache.logging.log4j;
 
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import org.apache.logging.log4j.junit.StatusLoggerRule;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ObjectMessage;
 import org.apache.logging.log4j.message.ParameterizedMessage;
@@ -29,10 +32,15 @@ import org.apache.logging.log4j.message.ParameterizedMessageFactory;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.spi.AbstractLogger;
 import org.apache.logging.log4j.spi.MessageFactory2Adapter;
+import org.apache.logging.log4j.status.StatusData;
+import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.MessageSupplier;
 import org.apache.logging.log4j.util.Supplier;
+import org.junit.Rule;
 import org.junit.Test;
 
+import java.util.List;
+
 /**
  *
  */
@@ -59,6 +67,9 @@ public class AbstractLoggerTest {
     private static final Marker MARKER = MarkerManager.getMarker("TEST");
     private static final String MARKER_NAME = "TEST";
 
+    @Rule
+    public StatusLoggerRule status = new StatusLoggerRule(Level.WARN);
+
     private static final LogEvent[] EVENTS = new LogEvent[] {
         new LogEvent(null, simple, null),
         new LogEvent(MARKER_NAME, simple, null),
@@ -902,6 +913,73 @@ public class AbstractLoggerTest {
         logger.log(Level.INFO, MARKER, supplier);
     }
 
+    @Test
+    public void testMessageThrows() {
+        final ThrowableExpectingLogger logger = new ThrowableExpectingLogger(false);
+        logger.error(new TestMessage(new TestMessage.FormattedMessageSupplier() {
+            @Override
+            public String getFormattedMessage() {
+                throw new IllegalStateException("Oops!");
+            }
+        }, "Message Format"));
+        List<StatusData> statusDatalist = StatusLogger.getLogger().getStatusData();
+        StatusData mostRecent = statusDatalist.get(statusDatalist.size() - 1);
+        assertEquals(Level.WARN, mostRecent.getLevel());
+        assertThat(mostRecent.getFormattedStatus(), containsString(
+                "org.apache.logging.log4j.spi.AbstractLogger caught " +
+                        "java.lang.IllegalStateException logging TestMessage: Message Format"));
+    }
+
+    @Test
+    public void testMessageThrowsAndNullFormat() {
+        final ThrowableExpectingLogger logger = new ThrowableExpectingLogger(false);
+        logger.error(new TestMessage(new TestMessage.FormattedMessageSupplier() {
+            @Override
+            public String getFormattedMessage() {
+                throw new IllegalStateException("Oops!");
+            }
+        }, null /* format */));
+        List<StatusData> statusDatalist = StatusLogger.getLogger().getStatusData();
+        StatusData mostRecent = statusDatalist.get(statusDatalist.size() - 1);
+        assertEquals(Level.WARN, mostRecent.getLevel());
+        assertThat(mostRecent.getFormattedStatus(), containsString(
+                "org.apache.logging.log4j.spi.AbstractLogger caught " +
+                        "java.lang.IllegalStateException logging TestMessage: "));
+    }
+
+    private static final class TestMessage implements Message {
+        private final FormattedMessageSupplier formattedMessageSupplier;
+        private final String format;
+        TestMessage(FormattedMessageSupplier formattedMessageSupplier, String format) {
+            this.formattedMessageSupplier = formattedMessageSupplier;
+            this.format = format;
+        }
+
+        @Override
+        public String getFormattedMessage() {
+            return formattedMessageSupplier.getFormattedMessage();
+        }
+
+        @Override
+        public String getFormat() {
+            return format;
+        }
+
+        @Override
+        public Object[] getParameters() {
+            return new Object[0];
+        }
+
+        @Override
+        public Throwable getThrowable() {
+            return null;
+        }
+
+        interface FormattedMessageSupplier {
+            String getFormattedMessage();
+        }
+    }
+
     private static class CountingLogger extends AbstractLogger {
         private static final long serialVersionUID = -3171452617952475480L;
 
@@ -1229,6 +1307,9 @@ public class AbstractLoggerTest {
             } else {
                 assertNull("Expected null but received a Throwable! "+t, t);
             }
+            if (message != null) {
+                message.getFormattedMessage();
+            }
         }
 
         @Override