With just using a rank the test impl would be lower than the core impl and so 
the core impl would be chosen and yes. it would work.

The user already has a way to specify the factory they want with a system 
property, but I'd prefer something better than that.  It might be nice to allow 
a log4j2.properties file that can specify the LoggerContextFactory and 
ContextSelector and possibly other things.  I'm not really sure about this - 
just looking for better ideas.

Ralph 


On Sep 28, 2012, at 3:06 PM, Gary Gregory wrote:

> OK, so back to:
> 
> "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."
> 
> So I really want my impl, I scan the system and edit some config file and use 
> a higher rank? Seems for advanced users but workable.
> 
> In the case I have today, the test impl would have a lower rank than the 
> stock impl? Then it would work within an IDE. Check?
> 
> Gary
> 
> On Fri, Sep 28, 2012 at 5:55 PM, Ralph Goers <ralph.go...@dslextreme.com> 
> wrote:
> 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
> 
> 
> 
> 
> -- 
> 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