That is interesting.  So Eclipse is seeing both the API's test factory and the 
real implementation.  I guess that makes sense.  I would probably have the same 
problem in IntelliJ except that I never run tests for anything in my IDE but 
always run Maven from the command line - even to debug.

At one point I considered allowing multiple implementations, but passing events 
to two logging implementations seems like a performance nightmare.  Also, the 
Log4j 2 API isn't really intended as a competitor or replacement for SLF4J.  

I think a better way to do this is to add one more piece of information to the 
meta-data - a rank/weight as is being done with the configuration factory. Then 
we will pick the one with the highest rank.

Ralph

On Sep 28, 2012, at 10:51 AM, Gary Gregory wrote:

> Hi All,
> 
> I am using Eclipse as my IDE and when I run 
> org.apache.logging.log4j.core.BasicLoggingTest I get an NPE because 
> org.apache.logging.log4j.LogManager.factory is null. It is null because when 
> the static initializer runs it picks up 2 factories instead of one:
> 
> [org.apache.logging.log4j.core.impl.Log4jContextFactory@39c8c1, 
> org.apache.logging.log4j.SimpleLoggerContextFactory@1ab2b55].
> 
> Can we be more lenient?
> 
> Instead of:
> 
>             if (factories.size() != 1) {
>                 logger.fatal("Unable to locate a logging implementation");
>             } else {
>                 factory = factories.get(0);
>             }
> 
> How about:
> 
>             if (factories.size() != 1) {
>                 logger.error("Expected a single logging implementation, not 
> {}, picking the first: {}", factories.size(), factories.get(0));
>             } 
>             factory = factories.get(0);
> 
> ?
> 
> -- 
> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org 
> JUnit in Action, 2nd Ed: http://bit.ly/ECvg0
> Spring Batch in Action: http://bit.ly/bqpbCK
> Blog: http://garygregory.wordpress.com 
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory

Reply via email to