You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Todor Boev (Jira)" <ji...@apache.org> on 2020/09/24 09:38:00 UTC
[jira] [Updated] (LOG4J2-2934) Under OSGi log4j-api almost never
binds to a Provider (e.g. from log4j-core)
[ https://issues.apache.org/jira/browse/LOG4J2-2934?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Todor Boev updated LOG4J2-2934:
-------------------------------
Summary: Under OSGi log4j-api almost never binds to a Provider (e.g. from log4j-core) (was: Under OSGi log4j-api almost never binds to a Provider (e.g. log4j-core))
> Under OSGi log4j-api almost never binds to a Provider (e.g. from log4j-core)
> ----------------------------------------------------------------------------
>
> Key: LOG4J2-2934
> URL: https://issues.apache.org/jira/browse/LOG4J2-2934
> Project: Log4j 2
> Issue Type: Bug
> Components: API
> Reporter: Todor Boev
> Priority: Major
>
> The log4j-api is has BundleActivator that has to obtain a lock provided by ProviderUtil so that it can block the binding of a Provider until one becomes available from another bundle.
> At the same time when the first class load request hits LogManager it runs a static code block that ultimately calls ProviderUtil to get a Provider by also obtaining the lock first. Except in this case if a provider is not available the lock is released and SimpleLoginContextFactory is bound from now on.
> There is a race condition between these two execution flows. If the BundleActivator manages to get the lock first the correct Provider will be used with it's LoginContextFactory. If the thread that triggers a class load of LogManager manages to grab the lock first the SimpleLoginContextFactory will be used.
> There is no predictable way to order this execution. It is sufficient for any arbitrary bundle to load a class that has a static Logger field before log4j-api is started to break the Provider binding. In almost all cases the wrong Provider is bound. Basically this part of the OSGi integration of Log4j 2 has to be completely bypassed using various hacks to get the non-OSGi way to bind a Provider to work.
> The correct way to fix this is for ProviderUtil to check whether it runs under OSGi and if so to block unconditionally waiting for a Provider to be supplied. Such a check is usually done in a static block by attempting to class load via reflection something from the core OSGi API.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)