Skip to content

Commit

Permalink
Merge pull request #215 from delgurth/SLF4J-466
Browse files Browse the repository at this point in the history
Fixes SLF4J-466
  • Loading branch information
ceki committed Aug 13, 2019
2 parents 8a5c449 + b0b57b9 commit 4ed2448
Show file tree
Hide file tree
Showing 4 changed files with 884 additions and 40 deletions.
55 changes: 40 additions & 15 deletions slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
Expand Up @@ -5,6 +5,7 @@
import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.helpers.SubstituteLogger;
import org.slf4j.helpers.Util;

public class EventRecodingLogger implements Logger {

Expand All @@ -22,6 +23,18 @@ public String getName() {
return name;
}

private void recordEvent(Level level, String msg, Object arg1, Object arg2) {
recordEvent(level, null, msg, arg1, arg2);
}

private void recordEvent(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 recordEvent(Level level, String msg, Object[] args, Throwable throwable) {
recordEvent(level, null, msg, args, throwable);
}
Expand All @@ -35,9 +48,23 @@ private void recordEvent(Level level, Marker marker, String msg, Object[] args,
loggingEvent.setLoggerName(name);
loggingEvent.addMarker(marker);
loggingEvent.setMessage(msg);
loggingEvent.setArgumentArray(args);
loggingEvent.setThrowable(throwable);
loggingEvent.setThreadName(Thread.currentThread().getName());

// 1 and 2 args are covered by other methods
if (throwable == null && args != null && args.length > 2) {
Throwable throwableCandidate = Util.getThrowableCandidate(args);
if(throwableCandidate != null) {
loggingEvent.setArgumentArray(Util.trimmedCopy(args));
loggingEvent.setThrowable(throwableCandidate);
} else {
loggingEvent.setArgumentArray(args);
loggingEvent.setThrowable(null);
}
} else {
loggingEvent.setArgumentArray(args);
loggingEvent.setThrowable(throwable);
}

eventQueue.add(loggingEvent);
}

Expand All @@ -54,7 +81,7 @@ public void trace(String format, Object arg) {
}

public void trace(String format, Object arg1, Object arg2) {
recordEvent(Level.TRACE, format, new Object[] { arg1, arg2 }, null);
recordEvent(Level.TRACE, format, arg1, arg2);
}

public void trace(String format, Object... arguments) {
Expand All @@ -79,7 +106,7 @@ public void trace(Marker marker, String format, Object arg) {
}

public void trace(Marker marker, String format, Object arg1, Object arg2) {
recordEvent(Level.TRACE, marker, format, new Object[] { arg1, arg2 }, null);
recordEvent(Level.TRACE, marker, format, arg1, arg2);
}

public void trace(Marker marker, String format, Object... argArray) {
Expand All @@ -105,8 +132,7 @@ public void debug(String format, Object arg) {
}

public void debug(String format, Object arg1, Object arg2) {
recordEvent(Level.DEBUG, format, new Object[] { arg1, arg2 }, null);

recordEvent(Level.DEBUG, format, arg1, arg2);
}

public void debug(String format, Object... arguments) {
Expand All @@ -130,7 +156,7 @@ public void debug(Marker marker, String format, Object arg) {
}

public void debug(Marker marker, String format, Object arg1, Object arg2) {
recordEvent(Level.DEBUG, marker, format, new Object[] { arg1, arg2 }, null);
recordEvent(Level.DEBUG, marker, format, arg1, arg2);
}

public void debug(Marker marker, String format, Object... arguments) {
Expand All @@ -154,7 +180,7 @@ public void info(String format, Object arg) {
}

public void info(String format, Object arg1, Object arg2) {
recordEvent(Level.INFO, format, new Object[] { arg1, arg2 }, null);
recordEvent(Level.INFO, format, arg1, arg2);
}

public void info(String format, Object... arguments) {
Expand All @@ -178,7 +204,7 @@ public void info(Marker marker, String format, Object arg) {
}

public void info(Marker marker, String format, Object arg1, Object arg2) {
recordEvent(Level.INFO, marker, format, new Object[] { arg1, arg2 }, null);
recordEvent(Level.INFO, marker, format, arg1, arg2);
}

public void info(Marker marker, String format, Object... arguments) {
Expand All @@ -204,7 +230,7 @@ public void warn(String format, Object arg) {
}

public void warn(String format, Object arg1, Object arg2) {
recordEvent(Level.WARN, format, new Object[] { arg1, arg2 }, null);
recordEvent(Level.WARN, format, arg1, arg2);
}

public void warn(String format, Object... arguments) {
Expand All @@ -224,12 +250,11 @@ public void warn(Marker marker, String msg) {
}

public void warn(Marker marker, String format, Object arg) {
recordEvent(Level.WARN, format, new Object[] { arg }, null);
recordEvent(Level.WARN, marker, 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);

recordEvent(Level.WARN, marker, format, arg1, arg2);
}

public void warn(Marker marker, String format, Object... arguments) {
Expand All @@ -254,7 +279,7 @@ public void error(String format, Object arg) {
}

public void error(String format, Object arg1, Object arg2) {
recordEvent(Level.ERROR, format, new Object[] { arg1, arg2 }, null);
recordEvent(Level.ERROR, format, arg1, arg2);

}

Expand Down Expand Up @@ -282,7 +307,7 @@ public void error(Marker marker, String format, Object arg) {
}

public void error(Marker marker, String format, Object arg1, Object arg2) {
recordEvent(Level.ERROR, marker, format, new Object[] { arg1, arg2 }, null);
recordEvent(Level.ERROR, marker, format, arg1, arg2);
}

public void error(Marker marker, String format, Object... arguments) {
Expand Down
25 changes: 2 additions & 23 deletions slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
Expand Up @@ -153,34 +153,13 @@ final public static FormattingTuple format(final String messagePattern, Object a


final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray) {
Throwable throwableCandidate = getThrowableCandidate(argArray);
Throwable throwableCandidate = Util.getThrowableCandidate(argArray);
Object[] args = argArray;
if (throwableCandidate != null) {
args = trimmedCopy(argArray);
args = Util.trimmedCopy(argArray);
}
return arrayFormat(messagePattern, args, throwableCandidate);
}

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;
}
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) {

Expand Down
47 changes: 45 additions & 2 deletions slf4j-api/src/main/java/org/slf4j/helpers/Util.java
Expand Up @@ -127,7 +127,50 @@ static final public void report(String msg, Throwable t) {
static final public void report(String msg) {
System.err.println("SLF4J: " + msg);
}



/**
* 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;
}

}

0 comments on commit 4ed2448

Please sign in to comment.