Thanks Ceki, the change  you made works.

On Mar 17, 2013, at 1:10 PM, ceki <[email protected]> wrote:

> 
> 
> On 17.03.2013 00:47, Jason van Zyl wrote:
>> If that's the case Ceki might be able to add the clearing of the logger map 
>> to the reset method.
>> 
>> Ceki, would this be hard to change?
> 
> I just added a reset method to SimpleLoggerFactory. See 
> https://github.com/qos-ch/slf4j/commit/6dd3a60ee77a5cd17e for the commit.  
> Here is sample code for invoking this method in Maven tests:
> 
> import org.slf4j.ILoggerFactory;
> import org.slf4j.LoggerFactory;
> 
>  ILoggerFactory iLoggerFactory = LoggerFactory.getILoggerFactory();
>  if(iLoggerFactory instanceof SimpleLoggerFactory) {
>    ((SimpleLoggerFactory) iLoggerFactory).reset();
>  }
> 
> As the reset() method is package protected, it needs to be invoked from code 
> in the org.slf4j.impl package. A "friend" class could expose the reset method 
> to classes in other packages.
> 
> Anyway, let me know how if this works for you.
> 
>> On Mar 16, 2013, at 4:38 PM, Stuart McCulloch <[email protected]> wrote:
>> 
>>> On 16 Mar 2013, at 13:58, Jason van Zyl wrote:
>>> 
>>>> Hervé,
>>>> 
>>>> Can you take a look at the logging changes you made to try and use the 
>>>> SLF4J package private method for resetting the logger? The streams are 
>>>> being reset correctly but the logging level doesn't appear to be reset 
>>>> which causes the embedded ITs to fail.
>>> 
>>> Did some investigating and the issue seems to be that SLF4J Simple uses a 
>>> static singleton logger factory which contains a map of cached loggers.
>>> 
>>> Because embedded test mode uses the same classloader for all the tests (it 
>>> only forks once at the start) each test therefore sees the same logger 
>>> factory and any previously cached loggers.
>>> 
>>> This means that although the MavenCLI successfully resets SLF4J to refresh 
>>> the log level, the new setting doesn't affect previously cached loggers 
>>> (they only pick up the level in their constructor).
>>> 
>>> This can be shown with the following hack to clear the logger map (not sane 
>>> code, just proof-of-concept) which solves the embedded logging IT failures:
>>> 
>>> diff --git 
>>> a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Slf4jSimpleConfiguration.java
>>>  
>>> b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Slf4jSimpleConfiguration.java
>>> index 6a7f385..f1af143 100644
>>> --- 
>>> a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Slf4jSimpleConfiguration.java
>>> +++ 
>>> b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Slf4jSimpleConfiguration.java
>>> @@ -58,5 +58,20 @@ public void activate()
>>>         // property for root logger level or System.out redirection need to 
>>> be taken into account
>>>         MavenSlf4jFriend.reset();
>>>         MavenSlf4jSimpleFriend.init();
>>> +
>>> +        try
>>> +        {
>>> +             org.slf4j.ILoggerFactory loggerFactory = 
>>> org.slf4j.LoggerFactory.getILoggerFactory();
>>> +             synchronized ( loggerFactory )
>>> +             {
>>> +                 java.lang.reflect.Field loggerMap = 
>>> loggerFactory.getClass().getDeclaredField( "loggerMap" );
>>> +                 loggerMap.setAccessible( true );
>>> +                 ( (java.util.Map) loggerMap.get( loggerFactory ) 
>>> ).clear();
>>> +             }
>>> +        }
>>> +        catch ( Exception e )
>>> +        {
>>> +            // ignore for now...
>>> +        }
>>>     }
>>> }
>>> 
>>>> Thanks,
>>>> 
>>>> Jason
>>>> 
>>>> ----------------------------------------------------------
>>>> Jason van Zyl
>>>> Founder & CTO, Sonatype
>>>> Founder,  Apache Maven
>>>> http://twitter.com/jvanzyl
>>>> ---------------------------------------------------------
>>>> 
>>>> People develop abstractions by generalizing from concrete examples.
>>>> Every attempt to determine the correct abstraction on paper without
>>>> actually developing a running system is doomed to failure. No one
>>>> is that smart. A framework is a resuable design, so you develop it by
>>>> looking at the things it is supposed to be a design of. The more examples
>>>> you look at, the more general your framework will be.
>>>> 
>>>> -- Ralph Johnson & Don Roberts, Patterns for Evolving Frameworks
>>> 
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>> 
>> 
>> Thanks,
>> 
>> Jason
> 
> --
> Ceki
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 

Thanks,

Jason

----------------------------------------------------------
Jason van Zyl
Founder & CTO, Sonatype
Founder,  Apache Maven
http://twitter.com/jvanzyl
---------------------------------------------------------

the course of true love never did run smooth ...

 -- Shakespeare





Reply via email to