Hi Ralph,
IMO new Object[0] as a param value is valid and should behave similar to a
call to the method without param i.e. logger.error("Hello World {} in {} ");
In the above context adding a conditional check params.length > 0 with then
the "if" @ line 157 wouldn't end up throwing the error and print the given
message
Regards,
-Yogesh
On Tue, Sep 2, 2014 at 9:45 PM, Ralph Goers <[email protected]>
wrote:
> 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]
>
>