What will you do instead of throwing an ArrayIndexOutOfBoundsException? This is obviously a user error. It would be misleading (but maybe acceptable) to substitute “null” for the placeholders, but just throwing a different exception probably isn’t worth the trouble.
Ralph On Sep 2, 2014, at 7:24 AM, Yogesh Rao <[email protected]> wrote: > Hi, > > There seems to be an issue with SimpleLogger implementation provided by > log4j2. The issue seems to be in the new improved API supporting > placeholders and var args when called with an Object Array of size 0. > > for e.g logger.error("Hello World {} in {} " , new Object[0]); > > A statement above results in an error as shown below > > ERROR StatusLogger Unable to locate a logging implementation, using > SimpleLogger > Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 > at > org.apache.logging.log4j.simple.SimpleLogger.logMessage(SimpleLogger.java:157) > at > org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1347) > at > org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1312) > at > org.apache.logging.log4j.spi.AbstractLogger.error(AbstractLogger.java:539) > at TestError.main(TestError.java:21) > > > > I managed to look at the code as well and it looks like a condition to > check of the var arg param array size is missing in SimpleLogger > > 155 final Object[] params = msg.getParameters(); > 156 Throwable t; > 157 if (throwable == null && params != null && > params[params.length - 1] instanceof Throwable) { > 158 t = (Throwable) params[params.length - 1]; > 159 } else { > 160 t = throwable; > 161 } > 162 if (t != null) { > 163 sb.append(SPACE); > 164 final ByteArrayOutputStream baos = new > ByteArrayOutputStream(); > 165 t.printStackTrace(new PrintStream(baos)); > 166 sb.append(baos.toString()); > 167 } > 168 stream.println(sb.toString()); > > > I can raise a JIRA issue and provide a fix with failing unit testcase. Let > me know if i can proceed ahead on this. > > Details of the environment are :- > Version used > > 1. JDK - Oracle JDK version 1.7 > 2. Log4j2 API - 2.0.1 > > > To reproduce following java class can be used : > > TestError.java > ------------------------ > > import org.apache.logging.log4j.LogManager; > import org.apache.logging.log4j.Logger; > > > > public class TestError { > > private static final Logger logger = LogManager.getLogger("TestError"); > /** > * @param args > */ > public static void main(String[] args) { > Object[] arr = null; > logger.error("Hello World {} in {} " , new Object[0]); > > } > > } > > Jars in Classpath > -------------------------- > Log4j2 API - 2.0.1 > > > Regards, > -Yogesh --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
