mirror of https://github.com/qos-ch/slf4j
fix bugs detected by SubstituteLoggerTest
This commit is contained in:
parent
10d78b04d6
commit
601405b76f
|
|
@ -31,8 +31,10 @@ import java.util.Queue;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.Marker;
|
||||
import org.slf4j.event.EventRecodingLogger;
|
||||
import org.slf4j.event.Level;
|
||||
import org.slf4j.event.LoggingEvent;
|
||||
import org.slf4j.event.SubstituteLoggingEvent;
|
||||
import org.slf4j.spi.LoggingEventBuilder;
|
||||
|
||||
/**
|
||||
* A logger implementation which logs via a delegate logger. By default, the delegate is a
|
||||
|
|
@ -61,174 +63,242 @@ public class SubstituteLogger implements Logger {
|
|||
this.createdPostInitialization = createdPostInitialization;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public LoggingEventBuilder makeLoggingEventBuilder(Level level) {
|
||||
return delegate().makeLoggingEventBuilder(level);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabledForLevel(Level level) {
|
||||
return delegate().isEnabledForLevel(level);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTraceEnabled() {
|
||||
return delegate().isTraceEnabled();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void trace(String msg) {
|
||||
delegate().trace(msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void trace(String format, Object arg) {
|
||||
delegate().trace(format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void trace(String format, Object arg1, Object arg2) {
|
||||
delegate().trace(format, arg1, arg2);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void trace(String format, Object... arguments) {
|
||||
delegate().trace(format, arguments);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(String msg, Throwable t) {
|
||||
delegate().trace(msg, t);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isTraceEnabled(Marker marker) {
|
||||
return delegate().isTraceEnabled(marker);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void trace(Marker marker, String msg) {
|
||||
delegate().trace(marker, msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void trace(Marker marker, String format, Object arg) {
|
||||
delegate().trace(marker, format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void trace(Marker marker, String format, Object arg1, Object arg2) {
|
||||
delegate().trace(marker, format, arg1, arg2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(Marker marker, String format, Object... arguments) {
|
||||
delegate().trace(marker, format, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(Marker marker, String msg, Throwable t) {
|
||||
delegate().trace(marker, msg, t);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public LoggingEventBuilder atTrace() {
|
||||
return delegate().atTrace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDebugEnabled() {
|
||||
return delegate().isDebugEnabled();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(String msg) {
|
||||
delegate().debug(msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(String format, Object arg) {
|
||||
delegate().debug(format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(String format, Object arg1, Object arg2) {
|
||||
delegate().debug(format, arg1, arg2);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(String format, Object... arguments) {
|
||||
delegate().debug(format, arguments);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(String msg, Throwable t) {
|
||||
delegate().debug(msg, t);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isDebugEnabled(Marker marker) {
|
||||
return delegate().isDebugEnabled(marker);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(Marker marker, String msg) {
|
||||
delegate().debug(marker, msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(Marker marker, String format, Object arg) {
|
||||
delegate().debug(marker, format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(Marker marker, String format, Object arg1, Object arg2) {
|
||||
delegate().debug(marker, format, arg1, arg2);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(Marker marker, String format, Object... arguments) {
|
||||
delegate().debug(marker, format, arguments);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void debug(Marker marker, String msg, Throwable t) {
|
||||
delegate().debug(marker, msg, t);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public LoggingEventBuilder atDebug() {
|
||||
return delegate().atDebug();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInfoEnabled() {
|
||||
return delegate().isInfoEnabled();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(String msg) {
|
||||
delegate().info(msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(String format, Object arg) {
|
||||
delegate().info(format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(String format, Object arg1, Object arg2) {
|
||||
delegate().info(format, arg1, arg2);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(String format, Object... arguments) {
|
||||
delegate().info(format, arguments);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(String msg, Throwable t) {
|
||||
delegate().info(msg, t);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isInfoEnabled(Marker marker) {
|
||||
return delegate().isInfoEnabled(marker);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(Marker marker, String msg) {
|
||||
delegate().info(marker, msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(Marker marker, String format, Object arg) {
|
||||
delegate().info(marker, format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(Marker marker, String format, Object arg1, Object arg2) {
|
||||
delegate().info(marker, format, arg1, arg2);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(Marker marker, String format, Object... arguments) {
|
||||
delegate().info(marker, format, arguments);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void info(Marker marker, String msg, Throwable t) {
|
||||
delegate().info(marker, msg, t);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoggingEventBuilder atInfo() {
|
||||
return delegate().atInfo();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isWarnEnabled() {
|
||||
return delegate().isWarnEnabled();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(String msg) {
|
||||
delegate().warn(msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(String format, Object arg) {
|
||||
delegate().warn(format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(String format, Object arg1, Object arg2) {
|
||||
delegate().warn(format, arg1, arg2);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(String format, Object... arguments) {
|
||||
delegate().warn(format, arguments);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(String msg, Throwable t) {
|
||||
delegate().warn(msg, t);
|
||||
}
|
||||
|
|
@ -236,75 +306,104 @@ public class SubstituteLogger implements Logger {
|
|||
public boolean isWarnEnabled(Marker marker) {
|
||||
return delegate().isWarnEnabled(marker);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(Marker marker, String msg) {
|
||||
delegate().warn(marker, msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(Marker marker, String format, Object arg) {
|
||||
delegate().warn(marker, format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(Marker marker, String format, Object arg1, Object arg2) {
|
||||
delegate().warn(marker, format, arg1, arg2);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(Marker marker, String format, Object... arguments) {
|
||||
delegate().warn(marker, format, arguments);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warn(Marker marker, String msg, Throwable t) {
|
||||
delegate().warn(marker, msg, t);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoggingEventBuilder atWarn() {
|
||||
return delegate().atWarn();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isErrorEnabled() {
|
||||
return delegate().isErrorEnabled();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(String msg) {
|
||||
delegate().error(msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(String format, Object arg) {
|
||||
delegate().error(format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(String format, Object arg1, Object arg2) {
|
||||
delegate().error(format, arg1, arg2);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(String format, Object... arguments) {
|
||||
delegate().error(format, arguments);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(String msg, Throwable t) {
|
||||
delegate().error(msg, t);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isErrorEnabled(Marker marker) {
|
||||
return delegate().isErrorEnabled(marker);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(Marker marker, String msg) {
|
||||
delegate().error(marker, msg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(Marker marker, String format, Object arg) {
|
||||
delegate().error(marker, format, arg);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(Marker marker, String format, Object arg1, Object arg2) {
|
||||
delegate().error(marker, format, arg1, arg2);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(Marker marker, String format, Object... arguments) {
|
||||
delegate().error(marker, format, arguments);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void error(Marker marker, String msg, Throwable t) {
|
||||
delegate().error(marker, msg, t);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoggingEventBuilder atError() {
|
||||
return delegate().atError();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o)
|
||||
|
|
@ -367,7 +466,7 @@ public class SubstituteLogger implements Logger {
|
|||
}
|
||||
return delegateEventAware;
|
||||
}
|
||||
|
||||
|
||||
public void log(LoggingEvent event) {
|
||||
if (isDelegateEventAware()) {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -1,13 +1,27 @@
|
|||
package org.slf4j;
|
||||
package org.slf4j.basicTests;
|
||||
|
||||
import static org.junit.Assert.assertFalse;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.event.Level;
|
||||
|
||||
public class LoggerUsage {
|
||||
public class FluentAPIUsage {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
org.slf4j.Logger logger = LoggerFactory.getLogger("aa");
|
||||
logger.atTrace().addKeyValue("a", "n").setCause(new Throwable()).log("aa");
|
||||
public void smoke() {
|
||||
String name = "smoke";
|
||||
Logger logger = LoggerFactory.getLogger(name);
|
||||
logger.atTrace().addKeyValue("a", "n").setCause(new Throwable()).log("hello");
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void smokxce() {
|
||||
String name = "smoke";
|
||||
Logger logger = LoggerFactory.getLogger("aa");
|
||||
assertFalse(logger.isEnabledForLevel(Level.DEBUG));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,10 +31,8 @@ import java.lang.reflect.InvocationHandler;
|
|||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.Test;
|
||||
|
|
@ -43,15 +41,24 @@ import org.slf4j.event.EventRecodingLogger;
|
|||
|
||||
/**
|
||||
* @author Chetan Mehrotra
|
||||
* @author Ceki Gülcü
|
||||
*/
|
||||
public class SubstitutableLoggerTest {
|
||||
|
||||
// atTrace excluded during development of 2.0 API
|
||||
// NOTE: previous implementations of this class performed a hand crafted conversion of
|
||||
// a method to a string. In this implementation we just invoke method.toString().
|
||||
|
||||
// WARNING: if you need to add an excluded method to have tests pass, ask yourself whether you
|
||||
// forgot to implement the said method with delegation in SubstituteLogger. You probably did.
|
||||
private static final Set<String> EXCLUDED_METHODS = new HashSet<String>(
|
||||
Arrays.asList("getName", "makeLoggingEventBuilder", "isEnabledForLevel", "atTrace", "atDebug", "atInfo", "atWarn", "atError"));
|
||||
Arrays.asList("getName"));
|
||||
|
||||
|
||||
/**
|
||||
* Test that all SubstituteLogger methods invoke the delegate, except for explicitly excluded methods.
|
||||
*/
|
||||
@Test
|
||||
public void testDelegate() throws Exception {
|
||||
public void delegateIsInvokedTest() throws Exception {
|
||||
SubstituteLogger substituteLogger = new SubstituteLogger("foo", null, false);
|
||||
assertTrue(substituteLogger.delegate() instanceof EventRecodingLogger);
|
||||
|
||||
|
|
@ -60,7 +67,7 @@ public class SubstitutableLoggerTest {
|
|||
Logger proxyLogger = (Logger) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { Logger.class }, ih);
|
||||
substituteLogger.setDelegate(proxyLogger);
|
||||
|
||||
invokeMethods(substituteLogger);
|
||||
invokeAllMethodsOf(substituteLogger);
|
||||
|
||||
// Assert that all methods are delegated
|
||||
expectedMethodSignatures.removeAll(ih.getInvokedMethodSignatures());
|
||||
|
|
@ -69,19 +76,32 @@ public class SubstitutableLoggerTest {
|
|||
}
|
||||
}
|
||||
|
||||
private void invokeMethods(Logger proxyLogger) throws InvocationTargetException, IllegalAccessException {
|
||||
private void invokeAllMethodsOf(Logger logger) throws InvocationTargetException, IllegalAccessException {
|
||||
for (Method m : Logger.class.getDeclaredMethods()) {
|
||||
if (!EXCLUDED_METHODS.contains(m.getName())) {
|
||||
m.invoke(proxyLogger, new Object[m.getParameterTypes().length]);
|
||||
m.invoke(logger, new Object[m.getParameterTypes().length]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static Set<String> determineMethodSignatures(Class<Logger> loggerClass) {
|
||||
Set<String> methodSignatures = new HashSet<String>();
|
||||
// Note: Class.getDeclaredMethods() does not include inherited methods
|
||||
for (Method m : loggerClass.getDeclaredMethods()) {
|
||||
if (!EXCLUDED_METHODS.contains(m.getName())) {
|
||||
methodSignatures.add(m.toString());
|
||||
}
|
||||
}
|
||||
return methodSignatures;
|
||||
}
|
||||
|
||||
|
||||
// implements InvocationHandler
|
||||
private class LoggerInvocationHandler implements InvocationHandler {
|
||||
private final Set<String> invokedMethodSignatures = new HashSet<String>();
|
||||
|
||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||
invokedMethodSignatures.add(getMethodSignature(method));
|
||||
invokedMethodSignatures.add(method.toString());
|
||||
if (method.getName().startsWith("is")) {
|
||||
return true;
|
||||
}
|
||||
|
|
@ -92,23 +112,4 @@ public class SubstitutableLoggerTest {
|
|||
return invokedMethodSignatures;
|
||||
}
|
||||
}
|
||||
|
||||
private static Set<String> determineMethodSignatures(Class<Logger> loggerClass) {
|
||||
Set<String> methodSignatures = new HashSet<String>();
|
||||
for (Method m : loggerClass.getDeclaredMethods()) {
|
||||
if (!EXCLUDED_METHODS.contains(m.getName())) {
|
||||
methodSignatures.add(getMethodSignature(m));
|
||||
}
|
||||
}
|
||||
return methodSignatures;
|
||||
}
|
||||
|
||||
private static String getMethodSignature(Method m) {
|
||||
List<String> result = new ArrayList<String>();
|
||||
result.add(m.getName());
|
||||
for (Class<?> clazz : m.getParameterTypes()) {
|
||||
result.add(clazz.getSimpleName());
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ document.write('<table class="footer" border="0">')
|
|||
|
||||
document.write('<tr>')
|
||||
|
||||
document.write(' <td valign="top" align="left">Copyright © 2004-2019 <a href="http://www.qos.ch/">QOS.ch</a></td>')
|
||||
document.write(' <td valign="top" align="left">Copyright © 2004-2021 <a href="http://www.qos.ch/">QOS.ch</a></td>')
|
||||
|
||||
//document.write(' <td rowspan="2">');
|
||||
//document.write(' <a href="http://twitter.com/qos_ch">');
|
||||
|
|
|
|||
Loading…
Reference in New Issue