diff --git a/.travis.yml b/.travis.yml
index 74f2ed9..af8e2b8 100755
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,9 @@
language: java
+
+jdk:
+ - openjdk8
+
notifications:
email:
- notification@qos.ch
+
diff --git a/integration/pom.xml b/integration/pom.xml
index 2c902ec..1e8a5df 100755
--- a/integration/pom.xml
+++ b/integration/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
integration
diff --git a/jcl-over-slf4j/pom.xml b/jcl-over-slf4j/pom.xml
index c8fc626..c809faf 100755
--- a/jcl-over-slf4j/pom.xml
+++ b/jcl-over-slf4j/pom.xml
@@ -5,7 +5,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
4.0.0
@@ -15,6 +15,14 @@
JCL 1.2 implemented over SLF4J
JCL 1.2 implemented over SLF4J
http://www.slf4j.org
+
+
+
+ Apache License, Version 2.0
+ https://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
diff --git a/jul-to-slf4j/pom.xml b/jul-to-slf4j/pom.xml
index f901603..619d696 100755
--- a/jul-to-slf4j/pom.xml
+++ b/jul-to-slf4j/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
jul-to-slf4j
diff --git a/log4j-over-slf4j/pom.xml b/log4j-over-slf4j/pom.xml
index c3e4afd..d45be51 100755
--- a/log4j-over-slf4j/pom.xml
+++ b/log4j-over-slf4j/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
diff --git a/osgi-over-slf4j/pom.xml b/osgi-over-slf4j/pom.xml
index 48bb26c..dc1a0df 100755
--- a/osgi-over-slf4j/pom.xml
+++ b/osgi-over-slf4j/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
osgi-over-slf4j
diff --git a/pom.xml b/pom.xml
index 583687f..c582aa1 100755
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
pom
SLF4J
diff --git a/slf4j-android/pom.xml b/slf4j-android/pom.xml
index 2b3d83f..ba70437 100644
--- a/slf4j-android/pom.xml
+++ b/slf4j-android/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-android
diff --git a/slf4j-api/pom.xml b/slf4j-api/pom.xml
index 2d678f0..db7a40f 100755
--- a/slf4j-api/pom.xml
+++ b/slf4j-api/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-api
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index 4a471f6..978d12d 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -4,13 +4,27 @@
import org.slf4j.Logger;
import org.slf4j.Marker;
+import org.slf4j.helpers.MessageFormatter;
import org.slf4j.helpers.SubstituteLogger;
+/**
+ *
+ * This class is used to record events during the initialization phase of the
+ * underlying logging framework. It is called by {@link SubstituteLogger}.
+ *
+ *
+ * @author Ceki Gülcü
+ * @author Wessel van Norel
+ *
+ */
public class EventRecodingLogger implements Logger {
String name;
SubstituteLogger logger;
Queue eventQueue;
+
+ // as an event recording logger we have no choice but to record all events
+ final static boolean RECORD_ALL_EVENTS = true;
public EventRecodingLogger(SubstituteLogger logger, Queue eventQueue) {
this.logger = logger;
@@ -22,12 +36,276 @@
return name;
}
- private void recordEvent(Level level, String msg, Object[] args, Throwable throwable) {
- recordEvent(level, null, msg, args, throwable);
- }
-
+ public boolean isTraceEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void trace(String msg) {
+ recordEvent_0Args(Level.TRACE, null, msg, null);
+ }
+
+ public void trace(String format, Object arg) {
+ recordEvent_1Args(Level.TRACE, null, format, arg);
+ }
+
+ public void trace(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.TRACE, null, format, arg1, arg2);
+ }
+
+ public void trace(String format, Object... arguments) {
+ recordEventArgArray(Level.TRACE, null, format, arguments);
+ }
+
+ public void trace(String msg, Throwable t) {
+ recordEvent_0Args(Level.TRACE, null, msg, t);
+ }
+
+ public boolean isTraceEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void trace(Marker marker, String msg) {
+ recordEvent_0Args(Level.TRACE, marker, msg, null);
+ }
+
+ public void trace(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.TRACE, marker, format, arg);
+ }
+
+ public void trace(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.TRACE, marker, format, arg1, arg2);
+ }
+
+ public void trace(Marker marker, String format, Object... argArray) {
+ recordEventArgArray(Level.TRACE, marker, format, argArray);
+ }
+
+ public void trace(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.TRACE, marker, msg, t);
+ }
+
+ public boolean isDebugEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void debug(String msg) {
+ recordEvent_0Args(Level.DEBUG, null, msg, null);
+ }
+
+ public void debug(String format, Object arg) {
+ recordEvent_1Args(Level.DEBUG, null, format, arg);
+ }
+
+ public void debug(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.DEBUG, null, format, arg1, arg2);
+ }
+
+ public void debug(String format, Object... arguments) {
+ recordEventArgArray(Level.DEBUG, null, format, arguments);
+ }
+
+ public void debug(String msg, Throwable t) {
+ recordEvent_0Args(Level.DEBUG, null, msg, t);
+ }
+
+ public boolean isDebugEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void debug(Marker marker, String msg) {
+ recordEvent_0Args(Level.DEBUG, marker, msg, null);
+ }
+
+ public void debug(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.DEBUG, marker, format, arg);
+ }
+
+ public void debug(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.DEBUG, marker, format, arg1, arg2);
+ }
+
+ public void debug(Marker marker, String format, Object... arguments) {
+ recordEventArgArray(Level.DEBUG, marker, format, arguments);
+ }
+
+ public void debug(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.DEBUG, marker, msg, t);
+ }
+
+ public boolean isInfoEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void info(String msg) {
+ recordEvent_0Args(Level.INFO, null, msg, null);
+ }
+
+ public void info(String format, Object arg) {
+ recordEvent_1Args(Level.INFO, null, format, arg);
+ }
+
+ public void info(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.INFO, null, format, arg1, arg2);
+ }
+
+ public void info(String format, Object... arguments) {
+ recordEventArgArray(Level.INFO, null, format, arguments);
+ }
+
+ public void info(String msg, Throwable t) {
+ recordEvent_0Args(Level.INFO, null, msg, t);
+ }
+
+ public boolean isInfoEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void info(Marker marker, String msg) {
+ recordEvent_0Args(Level.INFO, marker, msg, null);
+ }
+
+ public void info(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.INFO, marker, format, arg);
+ }
+
+ public void info(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.INFO, marker, format, arg1, arg2);
+ }
+
+ public void info(Marker marker, String format, Object... arguments) {
+ recordEventArgArray(Level.INFO, marker, format, arguments);
+ }
+
+ public void info(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.INFO, marker, msg, t);
+
+ }
+
+ public boolean isWarnEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void warn(String msg) {
+ recordEvent_0Args(Level.WARN, null, msg, null);
+ }
+
+ public void warn(String format, Object arg) {
+ recordEvent_1Args(Level.WARN, null, format, arg);
+ }
+
+ public void warn(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.WARN, null, format, arg1, arg2);
+ }
+
+ public void warn(String format, Object... arguments) {
+ recordEventArgArray(Level.WARN, null, format, arguments);
+ }
+
+ public void warn(String msg, Throwable t) {
+ recordEvent_0Args(Level.WARN, null, msg, t);
+ }
+
+ public boolean isWarnEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void warn(Marker marker, String msg) {
+ recordEvent_0Args(Level.WARN, marker, msg, null);
+ }
+
+ public void warn(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.WARN, marker, format, arg);
+ }
+
+ public void warn(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.WARN, marker, format, arg1, arg2);
+ }
+
+ public void warn(Marker marker, String format, Object... arguments) {
+ recordEventArgArray(Level.WARN, marker, format, arguments);
+ }
+
+ public void warn(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.WARN, marker, msg, t);
+ }
+
+ public boolean isErrorEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void error(String msg) {
+ recordEvent_0Args(Level.ERROR, null, msg, null);
+ }
+
+ public void error(String format, Object arg) {
+ recordEvent_1Args(Level.ERROR, null, format, arg);
+ }
+
+ public void error(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.ERROR, null, format, arg1, arg2);
+ }
+
+ public void error(String format, Object... arguments) {
+ recordEventArgArray(Level.ERROR, null, format, arguments);
+ }
+
+ public void error(String msg, Throwable t) {
+ recordEvent_0Args(Level.ERROR, null, msg, t);
+ }
+
+ public boolean isErrorEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void error(Marker marker, String msg) {
+ recordEvent_0Args(Level.ERROR, marker, msg, null);
+ }
+
+ public void error(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.ERROR, marker, format, arg);
+ }
+
+ public void error(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.ERROR, marker, format, arg1, arg2);
+ }
+
+ public void error(Marker marker, String format, Object... arguments) {
+ recordEventArgArray(Level.ERROR, marker, format, arguments);
+ }
+
+ public void error(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.ERROR, marker, msg, t);
+ }
+
+ private void recordEvent_0Args(Level level, Marker marker, String msg, Throwable t) {
+ recordEvent(level, marker, msg, null, t);
+ }
+
+ private void recordEvent_1Args(Level level, Marker marker, String msg, Object arg1) {
+ recordEvent(level, marker, msg, new Object[] { arg1 }, null);
+ }
+
+ private void recordEvent2Args(Level level, Marker marker, String msg, Object arg1, Object arg2) {
+ if (arg2 instanceof Throwable) {
+ recordEvent(level, marker, msg, new Object[] { arg1 }, (Throwable) arg2);
+ } else {
+ recordEvent(level, marker, msg, new Object[] { arg1, arg2 }, null);
+ }
+ }
+
+ private void recordEventArgArray(Level level, Marker marker, String msg, Object[] args) {
+ Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(args);
+ if (throwableCandidate != null) {
+ Object[] trimmedCopy = MessageFormatter.trimmedCopy(args);
+ recordEvent(level, marker, msg, trimmedCopy, throwableCandidate);
+ } else {
+ recordEvent(level, marker, msg, args, null);
+ }
+ }
+
+
+ // WARNING: this method assumes that any throwable is properly extracted
private void recordEvent(Level level, Marker marker, String msg, Object[] args, Throwable throwable) {
- // System.out.println("recording logger:"+name+", msg:"+msg);
SubstituteLoggingEvent loggingEvent = new SubstituteLoggingEvent();
loggingEvent.setTimeStamp(System.currentTimeMillis());
loggingEvent.setLevel(level);
@@ -35,262 +313,11 @@
loggingEvent.setLoggerName(name);
loggingEvent.setMarker(marker);
loggingEvent.setMessage(msg);
+ loggingEvent.setThreadName(Thread.currentThread().getName());
+
loggingEvent.setArgumentArray(args);
loggingEvent.setThrowable(throwable);
- loggingEvent.setThreadName(Thread.currentThread().getName());
+
eventQueue.add(loggingEvent);
}
-
- public boolean isTraceEnabled() {
- return true;
- }
-
- public void trace(String msg) {
- recordEvent(Level.TRACE, msg, null, null);
- }
-
- public void trace(String format, Object arg) {
- recordEvent(Level.TRACE, format, new Object[] { arg }, null);
- }
-
- public void trace(String format, Object arg1, Object arg2) {
- recordEvent(Level.TRACE, format, new Object[] { arg1, arg2 }, null);
- }
-
- public void trace(String format, Object... arguments) {
- recordEvent(Level.TRACE, format, arguments, null);
- }
-
- public void trace(String msg, Throwable t) {
- recordEvent(Level.TRACE, msg, null, t);
- }
-
- public boolean isTraceEnabled(Marker marker) {
- return true;
- }
-
- public void trace(Marker marker, String msg) {
- recordEvent(Level.TRACE, marker, msg, null, null);
-
- }
-
- public void trace(Marker marker, String format, Object arg) {
- recordEvent(Level.TRACE, marker, format, new Object[] { arg }, null);
- }
-
- public void trace(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.TRACE, marker, format, new Object[] { arg1, arg2 }, null);
- }
-
- public void trace(Marker marker, String format, Object... argArray) {
- recordEvent(Level.TRACE, marker, format, argArray, null);
-
- }
-
- public void trace(Marker marker, String msg, Throwable t) {
- recordEvent(Level.TRACE, marker, msg, null, t);
- }
-
- public boolean isDebugEnabled() {
- return true;
- }
-
- public void debug(String msg) {
- recordEvent(Level.DEBUG, msg, null, null);
- }
-
- public void debug(String format, Object arg) {
- recordEvent(Level.DEBUG, format, new Object[] { arg }, null);
-
- }
-
- public void debug(String format, Object arg1, Object arg2) {
- recordEvent(Level.DEBUG, format, new Object[] { arg1, arg2 }, null);
-
- }
-
- public void debug(String format, Object... arguments) {
- recordEvent(Level.DEBUG, format, arguments, null);
- }
-
- public void debug(String msg, Throwable t) {
- recordEvent(Level.DEBUG, msg, null, t);
- }
-
- public boolean isDebugEnabled(Marker marker) {
- return true;
- }
-
- public void debug(Marker marker, String msg) {
- recordEvent(Level.DEBUG, marker, msg, null, null);
- }
-
- public void debug(Marker marker, String format, Object arg) {
- recordEvent(Level.DEBUG, marker, format, new Object[] { arg }, null);
- }
-
- public void debug(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.DEBUG, marker, format, new Object[] { arg1, arg2 }, null);
- }
-
- public void debug(Marker marker, String format, Object... arguments) {
- recordEvent(Level.DEBUG, marker, format, arguments, null);
- }
-
- public void debug(Marker marker, String msg, Throwable t) {
- recordEvent(Level.DEBUG, marker, msg, null, t);
- }
-
- public boolean isInfoEnabled() {
- return true;
- }
-
- public void info(String msg) {
- recordEvent(Level.INFO, msg, null, null);
- }
-
- public void info(String format, Object arg) {
- recordEvent(Level.INFO, format, new Object[] { arg }, null);
- }
-
- public void info(String format, Object arg1, Object arg2) {
- recordEvent(Level.INFO, format, new Object[] { arg1, arg2 }, null);
- }
-
- public void info(String format, Object... arguments) {
- recordEvent(Level.INFO, format, arguments, null);
- }
-
- public void info(String msg, Throwable t) {
- recordEvent(Level.INFO, msg, null, t);
- }
-
- public boolean isInfoEnabled(Marker marker) {
- return true;
- }
-
- public void info(Marker marker, String msg) {
- recordEvent(Level.INFO, marker, msg, null, null);
- }
-
- public void info(Marker marker, String format, Object arg) {
- recordEvent(Level.INFO, marker, format, new Object[] { arg }, null);
- }
-
- public void info(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.INFO, marker, format, new Object[] { arg1, arg2 }, null);
- }
-
- public void info(Marker marker, String format, Object... arguments) {
- recordEvent(Level.INFO, marker, format, arguments, null);
- }
-
- public void info(Marker marker, String msg, Throwable t) {
- recordEvent(Level.INFO, marker, msg, null, t);
-
- }
-
- public boolean isWarnEnabled() {
- return true;
- }
-
- public void warn(String msg) {
- recordEvent(Level.WARN, msg, null, null);
- }
-
- public void warn(String format, Object arg) {
- recordEvent(Level.WARN, format, new Object[] { arg }, null);
-
- }
-
- public void warn(String format, Object arg1, Object arg2) {
- recordEvent(Level.WARN, format, new Object[] { arg1, arg2 }, null);
- }
-
- public void warn(String format, Object... arguments) {
- recordEvent(Level.WARN, format, arguments, null);
- }
-
- public void warn(String msg, Throwable t) {
- recordEvent(Level.WARN, msg, null, t);
- }
-
- public boolean isWarnEnabled(Marker marker) {
- return true;
- }
-
- public void warn(Marker marker, String msg) {
- recordEvent(Level.WARN, msg, null, null);
- }
-
- public void warn(Marker marker, String format, Object arg) {
- recordEvent(Level.WARN, format, new Object[] { arg }, null);
- }
-
- public void warn(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.WARN, marker, format, new Object[] { arg1, arg2 }, null);
-
- }
-
- public void warn(Marker marker, String format, Object... arguments) {
- recordEvent(Level.WARN, marker, format, arguments, null);
- }
-
- public void warn(Marker marker, String msg, Throwable t) {
- recordEvent(Level.WARN, marker, msg, null, t);
- }
-
- public boolean isErrorEnabled() {
- return true;
- }
-
- public void error(String msg) {
- recordEvent(Level.ERROR, msg, null, null);
- }
-
- public void error(String format, Object arg) {
- recordEvent(Level.ERROR, format, new Object[] { arg }, null);
-
- }
-
- public void error(String format, Object arg1, Object arg2) {
- recordEvent(Level.ERROR, format, new Object[] { arg1, arg2 }, null);
-
- }
-
- public void error(String format, Object... arguments) {
- recordEvent(Level.ERROR, format, arguments, null);
-
- }
-
- public void error(String msg, Throwable t) {
- recordEvent(Level.ERROR, msg, null, t);
- }
-
- public boolean isErrorEnabled(Marker marker) {
- return true;
- }
-
- public void error(Marker marker, String msg) {
- recordEvent(Level.ERROR, marker, msg, null, null);
-
- }
-
- public void error(Marker marker, String format, Object arg) {
- recordEvent(Level.ERROR, marker, format, new Object[] { arg }, null);
-
- }
-
- public void error(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.ERROR, marker, format, new Object[] { arg1, arg2 }, null);
- }
-
- public void error(Marker marker, String format, Object... arguments) {
- recordEvent(Level.ERROR, marker, format, arguments, null);
- }
-
- public void error(Marker marker, String msg, Throwable t) {
- recordEvent(Level.ERROR, marker, msg, null, t);
- }
-
}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
index bdbfb19..d23a3a6 100755
--- a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
@@ -152,35 +152,13 @@
}
- static final Throwable getThrowableCandidate(Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- return null;
- }
-
- final Object lastEntry = argArray[argArray.length - 1];
- if (lastEntry instanceof Throwable) {
- return (Throwable) lastEntry;
- }
- return null;
- }
-
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray) {
- Throwable throwableCandidate = getThrowableCandidate(argArray);
+ Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(argArray);
Object[] args = argArray;
if (throwableCandidate != null) {
- args = trimmedCopy(argArray);
+ args = MessageFormatter.trimmedCopy(argArray);
}
return arrayFormat(messagePattern, args, throwableCandidate);
- }
-
- private static Object[] trimmedCopy(Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- throw new IllegalStateException("non-sensical empty or null argument array");
- }
- final int trimemdLen = argArray.length - 1;
- Object[] trimmed = new Object[trimemdLen];
- System.arraycopy(argArray, 0, trimmed, 0, trimemdLen);
- return trimmed;
}
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray, Throwable throwable) {
@@ -411,4 +389,49 @@
sbuf.append(']');
}
+ /**
+ * Helper method to determine if an {@link Object} array contains a {@link Throwable} as last element
+ *
+ * @param argArray
+ * The arguments off which we want to know if it contains a {@link Throwable} as last element
+ * @return if the last {@link Object} in argArray is a {@link Throwable} this method will return it,
+ * otherwise it returns null
+ */
+ public static Throwable getThrowableCandidate(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ return null;
+ }
+
+ final Object lastEntry = argArray[argArray.length - 1];
+ if (lastEntry instanceof Throwable) {
+ return (Throwable) lastEntry;
+ }
+
+ return null;
+ }
+
+ /**
+ * Helper method to get all but the last element of an array
+ *
+ * @param argArray
+ * The arguments from which we want to remove the last element
+ *
+ * @return a copy of the array without the last element
+ */
+ public static Object[] trimmedCopy(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ throw new IllegalStateException("non-sensical empty or null argument array");
+ }
+
+ final int trimmedLen = argArray.length - 1;
+
+ Object[] trimmed = new Object[trimmedLen];
+
+ if (trimmedLen > 0) {
+ System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
+ }
+
+ return trimmed;
+ }
+
}
diff --git a/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
new file mode 100644
index 0000000..fa47efb
--- /dev/null
+++ b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
@@ -0,0 +1,525 @@
+package org.slf4j.event;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Marker;
+import org.slf4j.helpers.BasicMarkerFactory;
+import org.slf4j.helpers.SubstituteLogger;
+
+import java.util.Queue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import static org.junit.Assert.*;
+
+public class EventRecodingLoggerTest {
+ private Queue queue;
+ private EventRecodingLogger logger;
+ private String message;
+ private Object param1;
+ private Object param2;
+ private Object param3;
+ private Object[] oneParam;
+ private Object[] twoParams;
+ private Object[] threeParams;
+ private Throwable exception;
+ private Marker marker;
+
+ @Before
+ public void setUp() {
+ queue = new LinkedBlockingQueue();
+ logger = new EventRecodingLogger(new SubstituteLogger("testLogger", queue, true), queue);
+ message = "Test message with 3 parameters {} {} {} {}";
+ param1 = 1;
+ param2 = 2;
+ param3 = 3;
+ oneParam = new Object[] { param1 };
+ twoParams = new Object[] { param1, param2 };
+ threeParams = new Object[] { param1, param2, param3 };
+ exception = new IllegalStateException("We just need an exception");
+ marker = new BasicMarkerFactory().getMarker("testMarker");
+ }
+
+ @After
+ public void tearDown() {
+ assertTrue(queue.isEmpty());
+ }
+
+ @Test
+ public void singleMessage() {
+ for (Level level : Level.values()) {
+ singleMessageCheck(level);
+ }
+ }
+
+ private void singleMessageCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message);
+ break;
+ case DEBUG:
+ logger.debug(message);
+ break;
+ case INFO:
+ logger.info(message);
+ break;
+ case WARN:
+ logger.warn(message);
+ break;
+ case ERROR:
+ logger.error(message);
+ break;
+ }
+ verifyMessageWithoutMarker(level, null, null);
+ }
+
+ @Test
+ public void oneParameter() {
+ for (Level level : Level.values()) {
+ oneParameterCheck(level);
+ }
+ }
+ private void oneParameterCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1);
+ break;
+ case DEBUG:
+ logger.debug(message, param1);
+ break;
+ case INFO:
+ logger.info(message, param1);
+ break;
+ case WARN:
+ logger.warn(message, param1);
+ break;
+ case ERROR:
+ logger.error(message, param1);
+ break;
+ }
+ verifyMessageWithoutMarker(level, oneParam, null);
+ }
+
+ @Test
+ public void messageTwoParameters() {
+ for (Level level : Level.values()) {
+ messageTwoParametersCheck(level);
+ }
+ }
+
+ private void messageTwoParametersCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, param2);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, param2);
+ break;
+ case INFO:
+ logger.info(message, param1, param2);
+ break;
+ case WARN:
+ logger.warn(message, param1, param2);
+ break;
+ case ERROR:
+ logger.error(message, param1, param2);
+ break;
+ }
+ verifyMessageWithoutMarker(level, twoParams, null);
+ }
+
+ @Test
+ public void traceMessageThreeParameters() {
+ for (Level level : Level.values()) {
+ threeParameterCheck(level);
+ }
+ }
+
+ private void threeParameterCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, param2, param3);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, param2, param3);
+ break;
+ case INFO:
+ logger.info(message, param1, param2, param3);
+ break;
+ case WARN:
+ logger.warn(message, param1, param2, param3);
+ break;
+ case ERROR:
+ logger.error(message, param1, param2, param3);
+ break;
+ }
+ verifyMessageWithoutMarker(level, threeParams, null);
+ }
+
+ @Test
+ public void testMessageThrowable() {
+ for (Level level : Level.values()) {
+ throwableCheck(level);
+ }
+ }
+
+ private void throwableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, exception);
+ break;
+ case DEBUG:
+ logger.debug(message, exception);
+ break;
+ case INFO:
+ logger.info(message, exception);
+ break;
+ case WARN:
+ logger.warn(message, exception);
+ break;
+ case ERROR:
+ logger.error(message, exception);
+ break;
+ }
+ verifyMessageWithoutMarker(level, null, exception);
+ }
+
+ @Test
+ public void traceMessageOneParameterThrowable() {
+ for (Level level : Level.values()) {
+ oneParamThrowableCheck(level);
+ }
+ }
+
+ private void oneParamThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, exception);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, exception);
+ break;
+ case INFO:
+ logger.info(message, param1, exception);
+ break;
+ case WARN:
+ logger.warn(message, param1, exception);
+ break;
+ case ERROR:
+ logger.error(message, param1, exception);
+ break;
+ }
+ verifyMessageWithoutMarker(level, oneParam, exception);
+ }
+
+ @Test
+ public void traceMessageTwoParametersThrowable() {
+ for (Level level : Level.values()) {
+ twoParamThrowableCheck(level);
+ }
+ }
+
+ private void twoParamThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, param2, exception);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, param2, exception);
+ break;
+ case INFO:
+ logger.info(message, param1, param2, exception);
+ break;
+ case WARN:
+ logger.warn(message, param1, param2, exception);
+ break;
+ case ERROR:
+ logger.error(message, param1, param2, exception);
+ break;
+ }
+ verifyMessageWithoutMarker(level, twoParams, exception);
+ }
+
+ @Test
+ public void testMessageThreeParametersThrowable() {
+ for (Level level : Level.values()) {
+ messageWith3ArgsPlusException(level);
+ }
+ }
+
+ private void messageWith3ArgsPlusException(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, param2, param3, exception);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, param2, param3, exception);
+ break;
+ case INFO:
+ logger.info(message, param1, param2, param3, exception);
+ break;
+ case WARN:
+ logger.warn(message, param1, param2, param3, exception);
+ break;
+ case ERROR:
+ logger.error(message, param1, param2, param3, exception);
+ break;
+ }
+ verifyMessageWithoutMarker(level, threeParams, exception);
+ }
+
+ @Test
+ public void markerMessage() {
+ for (Level level : Level.values()) {
+ markerMessageCheck(level);
+ }
+ }
+ private void markerMessageCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message);
+ break;
+ case DEBUG:
+ logger.debug(marker, message);
+ break;
+ case INFO:
+ logger.info(marker, message);
+ break;
+ case WARN:
+ logger.warn(marker, message);
+ break;
+ case ERROR:
+ logger.error(marker, message);
+ break;
+ }
+ verifyMessage(level, marker, null, null);
+ }
+
+ @Test
+ public void markerMessageOneParameter() {
+ for (Level level : Level.values()) {
+ markerMessageOneParameter(level);
+ }
+ }
+ private void markerMessageOneParameter(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1);
+ break;
+ case INFO:
+ logger.info(marker, message, param1);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1);
+ break;
+ }
+ verifyMessage(level, marker, oneParam, null);
+ }
+
+ @Test
+ public void traceMarkerMessageTwoParameters() {
+ for (Level level : Level.values()) {
+ markerMessageTwoParameters(level);
+ }
+ }
+
+ private void markerMessageTwoParameters(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, param2);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, param2);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, param2);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, param2);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, param2);
+ break;
+ }
+ verifyMessage(level, marker, twoParams, null);
+ }
+
+ @Test
+ public void traceMarkerMessageThreeParameters() {
+ for (Level level : Level.values()) {
+ markerMessageThreeParameters(level);
+ }
+ }
+
+ private void markerMessageThreeParameters(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, param2, param3);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, param2, param3);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, param2, param3);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, param2, param3);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, param2, param3);
+ break;
+ }
+ verifyMessage(level, marker, threeParams, null);
+ }
+
+ @Test
+ public void markerMessageThrowable() {
+ for (Level level : Level.values()) {
+ markerMessageThrowable(level);
+ }
+ }
+
+ private void markerMessageThrowable(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, exception);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, exception);
+ break;
+ case INFO:
+ logger.info(marker, message, exception);
+ break;
+ case WARN:
+ logger.warn(marker, message, exception);
+ break;
+ case ERROR:
+ logger.error(marker, message, exception);
+ break;
+ }
+ verifyMessage(level, marker, null, exception);
+ }
+
+ @Test
+ public void markerMessageOneParameterThrowable() {
+ for (Level level : Level.values()) {
+ markerMessageOneParameterThrowableCheck(level);
+ }
+ }
+
+ private void markerMessageOneParameterThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, exception);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, exception);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, exception);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, exception);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, exception);
+ break;
+ }
+ verifyMessage(level, marker, oneParam, exception);
+ }
+
+ @Test
+ public void traceMarkerMessageTwoParametersThrowable() {
+ for (Level level : Level.values()) {
+ markerMessageTwoParametersThrowableCheck(level);
+ }
+ }
+
+ private void markerMessageTwoParametersThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, param2, exception);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, param2, exception);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, param2, exception);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, param2, exception);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, param2, exception);
+ break;
+ }
+ verifyMessage(level, marker, twoParams, exception);
+ }
+
+ @Test
+ public void traceMarkerMessageThreeParametersThrowable() {
+ for (Level level : Level.values()) {
+ markerMessageThreeParametersThrowableCheck(level);
+ }
+ }
+
+ private void markerMessageThreeParametersThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, param2, param3, exception);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, param2, param3, exception);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, param2, param3, exception);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, param2, param3, exception);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, param2, param3, exception);
+ break;
+ }
+ verifyMessage(level, marker, threeParams, exception);
+ }
+
+ private void verifyMessageWithoutMarker(Level level, Object[] arguments, Throwable exception) {
+ verifyMessage(level, null, arguments, exception);
+ }
+
+ private void verifyMessage(Level level, Marker marker, Object[] arguments, Throwable exception) {
+
+ assertEquals("missing event: ", 1, queue.size());
+ SubstituteLoggingEvent event = queue.poll();
+ assertNotNull(event);
+
+ if (marker == null) {
+ assertNull(event.getMarker());
+ } else {
+ assertEquals(marker, event.getMarker());
+ }
+
+ assertEquals(message, event.getMessage());
+
+ if (arguments == null) {
+ assertNull(event.getArgumentArray());
+ } else {
+ assertArrayEquals(arguments, event.getArgumentArray());
+ }
+
+ assertEquals("wrong level: ", level, event.getLevel());
+
+ if (exception == null) {
+ assertNull(event.getThrowable());
+ } else {
+ assertEquals(exception, event.getThrowable());
+ }
+ }
+}
diff --git a/slf4j-ext/pom.xml b/slf4j-ext/pom.xml
index ca1eca4..31e43dc 100755
--- a/slf4j-ext/pom.xml
+++ b/slf4j-ext/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-ext
diff --git a/slf4j-jcl/pom.xml b/slf4j-jcl/pom.xml
index da46b4d..aa8c1df 100755
--- a/slf4j-jcl/pom.xml
+++ b/slf4j-jcl/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-jcl
diff --git a/slf4j-jdk14/pom.xml b/slf4j-jdk14/pom.xml
index b852943..12479c3 100755
--- a/slf4j-jdk14/pom.xml
+++ b/slf4j-jdk14/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-jdk14
diff --git a/slf4j-log4j12/pom.xml b/slf4j-log4j12/pom.xml
index 1d0a1c5..33200a2 100755
--- a/slf4j-log4j12/pom.xml
+++ b/slf4j-log4j12/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-log4j12
diff --git a/slf4j-migrator/pom.xml b/slf4j-migrator/pom.xml
index 45bb698..3ea1fcc 100755
--- a/slf4j-migrator/pom.xml
+++ b/slf4j-migrator/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-migrator
diff --git a/slf4j-nop/pom.xml b/slf4j-nop/pom.xml
index b1aa9ba..3c52f1c 100755
--- a/slf4j-nop/pom.xml
+++ b/slf4j-nop/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-nop
diff --git a/slf4j-simple/pom.xml b/slf4j-simple/pom.xml
index 5b6af4a..8b130ce 100755
--- a/slf4j-simple/pom.xml
+++ b/slf4j-simple/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-simple
diff --git a/slf4j-site/pom.xml b/slf4j-site/pom.xml
index cabc5fb..3dea08b 100755
--- a/slf4j-site/pom.xml
+++ b/slf4j-site/pom.xml
@@ -7,7 +7,7 @@
org.slf4j
slf4j-parent
- 1.7.28
+ 1.7.29
slf4j-site
@@ -31,6 +31,16 @@
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ true
+
+
+
+
org.apache.maven.plugins
maven-source-plugin
@@ -40,9 +50,6 @@
**/META-INF/*
-
- x**
-