Oh I missed one more constellation

a plugin could have slf4j-1.5.x + a logging backend we do not know of. 

I hope such things dont often exist, but in theory it could happen.

For all of those cases we need isolation.


LieGrue,
strub




----- Original Message -----
> From: Mark Struberg <strub...@yahoo.de>
> To: Maven Developers List <dev@maven.apache.org>
> Cc: 
> Sent: Thursday, October 11, 2012 10:52 AM
> Subject: Re: SLF4J integration
> 
> A the end of the day we could have both actually!
> 
> Most plugins will add both as dependency. Otherwise they would not be able to 
> log via slf4j.
> 
> But there are also libraries like OpenJPA (via openjpa-maven-plugin) which do 
> auto detection. They look up what impls are available and decide what to use. 
> In 
> OpenJPA you can even force the one you like to use via a property in 
> persistence.xml. So in the real world it's even more complicated. 
> 
> I'm not sure how to translate "Das Leben ist kein 
> Kindergeburtstag" - literally it would be "live is no children 
> birthday" ;) 
> 
> 
> LieGrue,
> strub
> 
> 
> 
> ----- Original Message -----
>>  From: Anders Hammar <and...@hammar.net>
>>  To: Maven Developers List <dev@maven.apache.org>
>>  Cc: 
>>  Sent: Thursday, October 11, 2012 10:24 AM
>>  Subject: Re: SLF4J integration
>> 
>>  Just to get this clear in my head:
>>  When you're talking about "slf4j dependency" in a plugin, are 
> you
>>  talking about dependency to slf4j-api or an slf4j impl?
>> 
>>  /Anders
>> 
>>  On Thu, Oct 11, 2012 at 10:16 AM, ceki <c...@qos.ch> wrote:
>>>   On 11.10.2012 08:37, Mark Struberg wrote:
>>> 
>>>   Hi Mark,
>>> 
>>>>   Hi Ceki, thanks for the reply!
>>> 
>>> 
>>>>>   The method signatures of classes in the org.slf4j package such 
> as?
>>>>>   Logger, LoggerFactory, Marker, MDC, etc. are the same since 
> 2005.?
>>>> 
>>>>   No they are not. I did a diff between 1.2 and the latest and it
>>>>   seems a few trace() methods got added. This is only a minor 
> problem
>>>>   but still. This change is perfectly backward compatible, but 
> it's 
>>  not
>>>>   forward compatible. If there is any new signature added/changed in 
> a
>>>>   newer version which we will not yet use, then we would just crash 
> if a
>>>>   plugin uses the newer version. Now this is highly unlikely. But 
>>  I've
>>>>   seen this with commons logging and I've seen this with the
>>>>   LocationAwareLoger as you already mentioned below. This is btw 
> exactly
>>>>   the reason why we shade in all commons-* stuff to private 
> packages...
>>> 
>>>   Correct. The trace method was added in SLF4J version 1.4 released on
>>>   May 16th 2007. Interestingly enough, I can't remember a single
>>>   complaint about missing trace method. About 1% of slf4j-users use
>>>   versions earlier than 1.4. Among that 1%, even fewer have a dependency
>>>   requiring the trace method. As an end result, and as far as I can
>>>   tell, no one complains about the missing trace method in earlier slf4j
>>>   versions.
>>> 
>>>   My point is that there are some imaginary problems that never occur in
>>>   practice. In practice, the slf4j version some software is compiled
>>>   with is never a problem assuming it only imports from the org.slf4j
>>>   package.
>>> 
>>>>>   this means that the minor version of the SLF4J binding
>>>>>   must match that of the slf4j-api. The "maintenance"
>>>>>   number is unimportant.
>>>> 
>>> 
>>>>   That's perfectly fine that way! Please understand that this is
>>>>   nothing against slf4j! I just like to avoid that we introduce 
> build
>>>>   problems to existing projects. As highlighted in my previous post
>>>>   there ARE ways to do that (by shielding via ClassWorlds), but this 
> is
>>>>   not in place in trunk yet. Also there are zero integration tests 
> for
>>>>   it atm!
>>> 
>>>   OK.
>>> 
>>>>   Maven uses a child-first classloading strategy (with exceptions) - 
> a
>>>>   plugin would only see exactly 1 version. Currently (again: there 
> is
>>>>   atm no shielding in place yet) if a plugin would would provide 
> it's
>>>>   own slf4j-api-1.4.2 then the plugin would get this version of the
>>>>   Class. And if the plugin would invoke
>>>>   LoggerFactory.getLogger(this.class()) then what would happen? Most
>>>>   probably a classcast exception, right? There is a minor chance 
> that we
>>>>   do not blow up as there is a complex ClassLoading environment in
>>>>   place. But we only know after we have some IT in place which do 
> not
>>>>   exist yet. All the change got committed without a single IT, thus 
> my
>>>>   -1 in the first place.
>>> 
>>> 
>>>   While I agree with the gist of your argument, I still maintain that
>>>   "slf4j versions" is not the crux of the matter here. 
> However, as 
>>  you
>>>   point out, class isolation should be implemented and tested.
>>> 
>>>> 
>>>>>>   2.) if you use slf4j, then ALL the funnels and logging 
> backends 
>>  must
>>>>>>   have the very same version number than the slf4j-api. 
> Otherwise 
>>  you
>>>>>>   are pretty much doomed. Ceki, is this correct as well?
>>>>> 
>>>>> 
>>>>>   I would not go as far as "doomed". For example, the 
>>  following
>>>>>   combination will work fine: slf4j-api-1.7.2.jar,
>>>>>   sfl4j-simple-1.6.5.jar, log4j-over-slf4j-1.6.2.jar,
>>>>>   jcl-ocer-slf4j-1.7.1.jar and jul-to-slf4j-1.6.0.jar. In other 
>>  words,
>>>>>   you can freely mix artifacts in the 1.6.x and 1.7.x families.
>>> 
>>> 
>>>>   But can you freely mix 1.5.x and 1.6.x? or 1.7 and 1.5 or 1.4? No
>>>>   you cannot as far as I've seen. So we cannot make a general 
>>  assumption
>>>>   on that! The only safe rule is to not mix slf4j parts with 
> diverging
>>>>   major or minor number. Is this correct?
>>> 
>>>   Yes, that is correct.
>>> 
>>> 
>>>> 
>>>>>   Sounds good. I would recommend isolation regardless of the 
> version 
>>  of
>>>>>   the discovered slf4j dependency. The plugin author probably 
> wishes
>>>>>   logging isolation. Maven should let the plugin have its own 
>>  separate
>>>>>   logging environment distinct from Maven's own logging.
>>> 
>>> 
>>>>   But that would actually be a big step backwards imo.
>>> 
>>>   No, separating maven logging and plugin logging (for the plugins that
>>>   explicitly set their own slf4j logging environment) is not a step
>>>   backwards. On the contrary, it preserves existing behavior.
>>> 
>>>   In my earlier message, I apparently did not insist enough on the the
>>>   point that isolation was only required for the minority of plugins
>>>   which set up their own slf4j-based logging environment. The vast
>>>   majority of plugins which do not declare an slf4j dependency, would
>>>   get their slf4j loggers either via injection or via getLogger().
>>> 
>>>>   Currently any plugin is forced to 'funnel' the output into 
> the
>>>>   logger it obtains via getLogger() itself. This is an instance of
>>>>   org.apache.maven.plugin.logging.Log and we have it perfectly under 
> our
>>>>   own control. It's not a perfectly convenient logging api but 
> it 
>>  works
>>>>   and shields us from all implementation details!
>>> 
>>>   This has been discussed earlier so I won't respond.
>>> 
>>>>   If we would isolate away all the logging of a plugin (because it
>>>>   contains a diverging slf4j version) then we would loose all this 
> logs,
>>>>   right?
>>> 
>>>   Of course not. The logs would be available in the logging environment
>>>   proper to the plugin (declaring its own logging environment), 
> that's
>>>   the beauty of this approach.
>>> 
>>>>   It is perfectly valid for any plugin to use slf4j right now.
>>> 
>>> 
>>>   Absolutely.
>>> 
>>>>   All it needs to do is to funnel it into our own maven logging
>>>>   api. We could e.g. provide a slf4j-maven-logging backend so users
>>>>   could use it even more easily.
>>> 
>>> 
>>>   I think that's an understandable mistake but a mistake 
> nonetheless. We
>>>   don't want to funnel plugin logging (for a plugin declaring its 
> own
>>>   slf4j dependencies) into Maven logging. For one, that's not the
>>>   *current* behavior as Maven logging and plugin logging (depending on
>>>   slf4j) are obviously independent. For two, attempts at such 
> integration
>>>   quickly become insurmountably complex. Logging integration between
>>>   Maven and a pluging declaring its own slf4j dependencies is not needed
>>>   and certainly not worth the effort.
>>> 
>>>   If unconvinced, I suggest we study concrete examples.
>>> 
>>>   --
>>>   Ceki
>>>   65% of statistics are made up on the spot
>>> 
>>>   ---------------------------------------------------------------------
>>>   To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
>>>   For additional commands, e-mail: dev-h...@maven.apache.org
>>> 
>> 
>>  ---------------------------------------------------------------------
>>  To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
>>  For additional commands, e-mail: dev-h...@maven.apache.org
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
> For additional commands, e-mail: dev-h...@maven.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
For additional commands, e-mail: dev-h...@maven.apache.org

Reply via email to