PR created: https://github.com/apache/logging-log4j2/pull/1136

Would appreciate reviews over the next couple days.
—
Matt Sicker

> On Nov 7, 2022, at 12:29, Matt Sicker <m...@musigma.org> wrote:
> 
> I’ve got a much simpler refactor for API initialization which avoids 
> introducing new SPIs (i.e., it re-uses the Provider service as-is). I’ll file 
> it as a PR later today. It can likely be improved further (mostly related to 
> the PropertyEnvironment init and injection), but it’s an improvement at least 
> for centralizing most of the startup logic into a single class (basically a 
> rewrite of ProviderUtil). One major change I was able to make in this, 
> though, was simplifying the OSGi bundle activators quite a bit. The API 
> activator mainly needs to acquire an initialization lock and set up a bundle 
> event listener to wait for other bundles to be installed. Once a bundle is 
> installed that actually has a Log4j Provider to load from it, it can register 
> its providers via ServiceRegistry (rather than directly invoking 
> ProviderUtil) and then unlock the initialization lock. Using 
> ServiceLoader::load in the bundle change listener seems to work well enough 
> (only disadvantage to this approach is that it requires giving the Log4j 
> bundles some high level permissions in order to acquire different bundles’ 
> ClassLoader or BundleWiring objects, but that assumes the user is using both 
> OSGi and a SecurityManager at the same time which just sounds dreadful), and 
> it can also remove a bit of custom OSGi service registration or lookup logic.
> 
> If we go as far as providing a full lifecycle for, say, LoggerContextFactory 
> (and not just the LoggerContext objects which already have a lifecycle), then 
> it could potentially be shutdown from the bundle activator as well, though 
> that might already rely on the ShutdownCallbackRegistry.
> 
>> On Nov 7, 2022, at 12:19 AM, Ralph Goers <ralph.go...@dslextreme.com> wrote:
>> 
>> Note that PropertiesUtil will need some work in master to implement 
>> https://cwiki.apache.org/confluence/display/LOGGING/Properties+Enhancement 
>> <https://cwiki.apache.org/confluence/display/LOGGING/Properties+Enhancement>.
>> 
>> Ralph
>> 
>>> On Nov 6, 2022, at 6:37 PM, Matt Sicker <m...@musigma.org> wrote:
>>> 
>>> On the LowLevelLogUtil front, I’ve updated that to use StatusLogger now 
>>> once StatusLogger has initialized. The code could probably be backported to 
>>> 2.x.
>>> 
>>> As for how PropertiesUtil caches values, simplifications there would be 
>>> great!
>>> —
>>> Matt Sicker
>>> 
>>>> On Nov 6, 2022, at 03:37, Piotr P. Karwasz <piotr.karw...@gmail.com> wrote:
>>>> 
>>>> Hi Matt,
>>>> 
>>>> On Sat, 5 Nov 2022 at 22:32, Matt Sicker <m...@musigma.org> wrote:
>>>>> After an attempt at soloing the idea, I’ve reverted my changes and am 
>>>>> instead documenting the current system along with adding some proposals 
>>>>> in the following Confluence doc [0]. I’ve analyzed the initialization 
>>>>> ordering of the API (without going into detail of how log4j-core 
>>>>> initializes as this differs fairly significantly in 2.x and 3.x at this 
>>>>> point). Right now, some of the main differences between 2.x and master is 
>>>>> that most of the documented static fields from initialization are 
>>>>> currently refactored into Lazy<T> static fields, though that only defers 
>>>>> initialization until slightly later.
>>>> 
>>>> Thanks for analyzing and writing down this quite complex initialization 
>>>> process.
>>>> 
>>>> My main concerns with the way this works now are:
>>>> 
>>>> 1. Logging of errors in the pre-StatusLogger phase is inconsistent.
>>>> Some classes use `LowLevelLogUtil`, some ignore errors, while the
>>>> usage of StatusLogger I introduced in `ServiceLoaderUtil` is brittle:
>>>> it requires to call `loadServices` with `verbose = false` to disable
>>>> the usage of `StatusLogger`. I think that the ideal solution would be
>>>> to remove enough static initialization from `StatusLogger` and
>>>> `AbstractLogger` (i.e. move it to constructors) so that
>>>> LowLevelLogUtil can create a `StatusLogger` with a hardcoded
>>>> configuration. Later in the initialization process we can replace it
>>>> with the real `StatusLogger`.
>>>> 
>>>> 2. There are still a couple of singleton classes that cache the result
>>>> of `PropertiesUtil.getProperty` in private static fields. I think
>>>> these calls can be easily moved to the constructor of the class. E.g.
>>>> `StatusLogger` could easily have a constructor that does not require
>>>> `PropertiesUtil` at all.
>>>> 
>>>> 3. The way `PropertiesUtil` caches values could be simplified (cf.
>>>> discussion in https://issues.apache.org/jira/browse/LOG4J2-3621): it
>>>> caches all values from environment variables and Java system
>>>> properties at startup. Most of the time none of those values configure
>>>> Log4j2. On the other hand missing values are not cached, so most of
>>>> the time a lookup for `log4j2.configurationFile` will find no value in
>>>> the cache, perform a lookup in all available property sources and
>>>> return `null`.
>>>> 
>>>> Most of these changes can also be done in `release-2.x` without
>>>> breaking public and protected members.
>>>> 
>>>> Piotr
>>> 
>> 
> 

Reply via email to