[logback-dev] removing context selectors will break our libraries and applications
Garret Wilson
garret at globalmentor.com
Sun Apr 28 21:50:13 CEST 2019
On 4/28/2019 12:15 PM, Ceki wrote:
>
> …
>
> Static binding and ServiceLoader accomplish the overall same task,
> with the ServiceLoader provide mechanism being a little more flexible.
"Little" is an understatement. :)
> The move was mandatory in order to support JPMS/Java 9 modules.
I completely understand and wholeheartedly agree. And even without Java
9+ modules, switching to service providers is extremely welcome. The old
approach was brittle and (etc.).
>
> Regarding ContextSelector, it would be possible to reintroduce it,
> provided there is interest by the community.
Ceki, this is not just a nice-to-have; it is absolutely essential! I
don't know how more emphatic I can be. Please see my previous email
below. I wrote an entire DZone article discussing the need. I analyzed
the Logback bootstrap in depth and commented on it on Stack Overflow.
Removing the context selector functionality will completely break our
library.
I would imagine most in the community don't even know there exists a
context selector, and that's mostly because using it requires setting
some obscure properties with magic strings like "JNDI", or setting other
properties with the name of a context selector implementation, but all
this must be done _before the whole thing is bootstrapped_, which is
very brittle. For example, here is how we do it, and cross our fingers
that someone loads our class before loading the StaticLoggerBinder class:
static {
//tell Logback to use the ClogrContextSelector for determining
logging contexts
System.setProperty(LOGBACK_CONTEXT_SELECTOR,
ClogrContextSelector.class.getName());
//load the SLF4J logger binder that initiates the Logback binding
and installs the context selector
StaticLoggerBinder.getSingleton();
}
But this need not be the case! It's very simple to load the context
selector registered as a service provider. That's why I filed
https://jira.qos.ch/browse/LOGBACK-1196 almost three years ago. You'll
see in the comments that another user is doing the same thing we are,
and needs this functionality as well.
In that ticket I even provided the code you need. And it's even
backwards-compatible!!
So I don't know what else to do here. I've written articles. I've posted
on Stack Overflow. I've filed a ticket. Another user has agreed 100%
with me. I've written the code that's needed. What else do you require?
Can I implement this for you and file a pull request somewhere?
Garret
>>
>> On 7/6/2018 10:49 AM, Garret Wilson wrote:
>>> Hi,
>>>
>>> I've been pretty deep inside the Logback code. In fact I wrote a
>>> comprehensive explanation on the bootstrap procedure here:
>>> https://stackoverflow.com/a/38317149/421049
>>>
>>> We've created a library called Csar that allows one to configure
>>> various configuration "contexts" within the same JVM, for a program
>>> that has different locales at the same time, or different logging
>>> configurations for different users, etc. I explain this all at
>>> https://dzone.com/articles/creating-local-globals-with-csar .
>>>
>>> Our Clogr library used Csar to allow different logging
>>> configurations (or even different logging libraries!) to be set up
>>> for different parts of the application. (Imagine a server with
>>> different user sessions, each session being logged to a different
>>> file.) We got this working great for Logback. In fact we integrated
>>> it into our software development course; read about it here:
>>> https://clogr.io/learn (See the section on Clogr and
>>> compartmentalized configurations with Logback at the bottom.)
>>>
>>> The problem is that the initial bootstrap sequence of Logback was
>>> brittle, relying on a static class that could appear across modules.
>>> The appearance of the Java 9+ module system prohibits this
>>> altogether. But I had already created a ticket
>>> https://jira.qos.ch/browse/LOGBACK-1196 for how to fix this, long
>>> before the Java system was released, using the standard service
>>> provider mechanism.
>>>
>>> But now I see at https://logback.qos.ch/news.html that Logback will
>>> remove contexts altogether. This will break our ability to configure
>>> loggers separately in our application, and to use Clogr to manage them.
>>>
>>> Why remove this? There was nothing wrong with the simple context
>>> selection. The problem was how it was configured, using a static
>>> classes that had to be placed in a module outside its package. Just
>>> implement https://jira.qos.ch/browse/LOGBACK-1196, please. Don't
>>> break our application. I even provide much of the code to do this at
>>> LOGBACK-1196.
>>>
>>> What can we do to keep this from being removed and breaking our
>>> library? Why do we need to remove it in the first place? Why not fix
>>> it?
>>>
>>> (Ironically I was just told that Log4j 2 supports contexts, so maybe
>>> our application will have to switch back to Log4j. But I would
>>> prefer to have Clogr support both Logback and Log4j 2. There is no
>>> reason to remove this capability from Logback.)
>>>
>>> As I mentioned two years ago in LOGBACK-1196, I'm willing to
>>> contribute to fixing this. Let me know how to go forward.
>>>
>>> Thanks,
>>>
>>> Garret Wilson
>>> President
>>> GlobalMentor, Inc.
>>>
>>> _______________________________________________
>>> logback-dev mailing list
>>> logback-dev at qos.ch
>>> http://mailman.qos.ch/mailman/listinfo/logback-dev
>>
>> _______________________________________________
>> logback-dev mailing list
>> logback-dev at qos.ch
>> http://mailman.qos.ch/mailman/listinfo/logback-dev
>>
>
More information about the logback-dev
mailing list