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