While it is consistent I wouldn't call it deterministic. For example, JBoss 5 
has an SLF4J implementation in common/lib. Your application may have one in 
WEB-INF/lib.   One of them will always win but how is it deterministic which 
one it will be?  What if it isn't the one you want? What can be done to 
override it?

Ralph


On Sep 28, 2012, at 1:01 PM, Gary Gregory wrote:

> Agree but doesn't the current code use the classpath order? If not, could it? 
> That would be deterministic, just like I can place a jar at the front of the 
> CP to override one or more classes.
> 
> Gary
> 
> On Fri, Sep 28, 2012 at 3:51 PM, Ralph Goers <ralph.go...@dslextreme.com> 
> wrote:
> The problem I have is that it isn't deterministic and I very much dislike 
> that.  SLF4J is that way today and it is annoying that you can't guarantee 
> the winner.
> 
> Ralph
> 
> 
> 
> On Sep 28, 2012, at 11:21 AM, Gary Gregory wrote:
> 
>> What about just picking the first one like in the example below (note the 
>> new error message) 
>> 
>> Gary
>> 
>> On Sep 28, 2012, at 14:06, Ralph Goers <ralph.go...@dslextreme.com> wrote:
>> 
>>> 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
>>> 
> 
> 
> 
> 
> -- 
> 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