On Tue, Dec 6, 2016 at 9:08 PM, Matt Sicker <boa...@gmail.com> wrote:

> Also, for some context: all classes in log4-core.jar share the same
> ClassLoader in OSGi, so using one from class A can be used to load class B.
> LoaderUtil tends to rely on getting whatever ClassLoader is in the current
> Thread's context ClassLoader which by default is whatever ClassLoader was
> used to create the Thread. In OSGi, the current thread can easily be one
> created by a class outside log4j-core. The same rule applies to log4j-api
> and any other log4j modules doing dynamic class loading.
>
> I think some uses of LoaderUtil should be looked at again as this issue is
> probably present in a couple other places as well. I'll see what I can find.
>

Great! Thanks Matt.

Gary


>
> On 6 December 2016 at 22:52, Matt Sicker <boa...@gmail.com> wrote:
>
>> In an OSGi environment, the best ClassLoader to use for something in
>> log4j-core is one obtained from a class in log4j-core. Come to think of it,
>> it'd be better to do something like this:
>>
>> LoggerContext.class.getClassLoader().loadClass(...);
>>
>> On 6 December 2016 at 22:39, Gary Gregory <garydgreg...@gmail.com> wrote:
>>
>>> I think one of the points here is that a class is loaded from a specific
>>> class loader. This is not clear from the code or comments. I am not sure
>>> this 100% correct either but if that fixes at least the null class loader
>>> NPE then that is a good thing. Especially if the fix is less hacky than
>>> inially proposed. I am open to better comments and code ;-)
>>>
>>> Gary
>>>
>>>
>>> On Dec 6, 2016 8:24 PM, "Matt Sicker" <boa...@gmail.com> wrote:
>>>
>>> I'm not sure if that LoaderUtil line will work properly everywhere. You
>>> already implicitly load the class by referencing the class's .class
>>> property I think. Either way, a more amusing and surefire way to make it
>>> load would be:
>>>
>>> ExecutorServices.class.getClassLoader().loadClass(ExecutorSe
>>> rvices.class.getName());
>>>
>>> Or use one of the LoaderUtil/Loader methods that takes a ClassLoader
>>> argument to avoid an NPE if log4j is loaded as a bootstrap class somehow.
>>>
>>> ---------- Forwarded message ----------
>>> From: <ggreg...@apache.org>
>>> Date: 6 December 2016 at 18:07
>>> Subject: logging-log4j2 git commit: [LOG4J2-1642]
>>> To: comm...@logging.apache.org
>>>
>>>
>>> Repository: logging-log4j2
>>> Updated Branches:
>>>   refs/heads/master 2eb02c827 -> bdac7f223
>>>
>>>
>>> [LOG4J2-1642]
>>>
>>> DefaultShutdownCallbackRegistry can throw a NoClassDefFoundError.
>>>
>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>>> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit
>>> /bdac7f22
>>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/b
>>> dac7f22
>>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/b
>>> dac7f22
>>>
>>> Branch: refs/heads/master
>>> Commit: bdac7f223b41dfbbf204ca924d08e6ed86c76769
>>> Parents: 2eb02c8
>>> Author: Johno Crawford <jo...@sulake.com>
>>> Authored: Tue Dec 6 16:07:52 2016 -0800
>>> Committer: Gary Gregory <garydgreg...@gmail.com>
>>> Committed: Tue Dec 6 16:07:52 2016 -0800
>>>
>>> ----------------------------------------------------------------------
>>>  .../apache/logging/log4j/core/LoggerContext.java    | 16
>>> +++++++++++++---
>>>  .../core/util/DefaultShutdownCallbackRegistry.java  |  9 +++++++--
>>>  src/changes/changes.xml                             |  3 +++
>>>  3 files changed, 23 insertions(+), 5 deletions(-)
>>> ----------------------------------------------------------------------
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b
>>> dac7f22/log4j-core/src/main/java/org/apache/logging/log4j/co
>>> re/LoggerContext.java
>>> ----------------------------------------------------------------------
>>> diff --git 
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/Log
>>> gerContext.java
>>> index 6902ade..4c4845e 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Log
>>> gerContext.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Log
>>> gerContext.java
>>> @@ -16,6 +16,8 @@
>>>   */
>>>  package org.apache.logging.log4j.core;
>>>
>>> +import static org.apache.logging.log4j.core.
>>> util.ShutdownCallbackRegistry.SHUTDOWN_HOOK_MARKER;
>>> +
>>>  import java.beans.PropertyChangeEvent;
>>>  import java.beans.PropertyChangeListener;
>>>  import java.io.File;
>>> @@ -52,10 +54,9 @@ import org.apache.logging.log4j.spi.AbstractLogger;
>>>  import org.apache.logging.log4j.spi.LoggerContextFactory;
>>>  import org.apache.logging.log4j.spi.LoggerRegistry;
>>>  import org.apache.logging.log4j.spi.Terminable;
>>> +import org.apache.logging.log4j.util.LoaderUtil;
>>>  import org.apache.logging.log4j.util.PropertiesUtil;
>>>
>>> -import static org.apache.logging.log4j.core.
>>> util.ShutdownCallbackRegistry.SHUTDOWN_HOOK_MARKER;
>>> -
>>>  /**
>>>   * The LoggerContext is the anchor for the logging system. It maintains
>>> a list of all the loggers requested by
>>>   * applications and a reference to the Configuration. The Configuration
>>> will contain the configured loggers, appenders,
>>> @@ -63,7 +64,16 @@ import static org.apache.logging.log4j.core.
>>> util.ShutdownCallbackRegistry.SHUTDO
>>>   */
>>>  public class LoggerContext extends AbstractLifeCycle
>>>          implements org.apache.logging.log4j.spi.LoggerContext,
>>> AutoCloseable, Terminable, ConfigurationListener {
>>> -
>>> +
>>> +    static {
>>> +        try {
>>> +            // LOG4J2-1642 preload ExecutorServices as it is used in
>>> shutdown hook
>>> +            LoaderUtil.loadClass(ExecutorServices.class.getName());
>>> +        } catch (final Exception e) {
>>> +            LOGGER.error("Failed to preload ExecutorServices class.",
>>> e);
>>> +        }
>>> +    }
>>> +
>>>      /**
>>>       * Property name of the property change event fired if the
>>> configuration is changed.
>>>       */
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b
>>> dac7f22/log4j-core/src/main/java/org/apache/logging/log4j/co
>>> re/util/DefaultShutdownCallbackRegistry.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/uti
>>> l/DefaultShutdownCallbackRegistry.java b/log4j-core/src/main/java/org
>>> /apache/logging/log4j/core/util/DefaultShutdownCallbackRegistry.java
>>> index 48d54b6..d2be690 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/uti
>>> l/DefaultShutdownCallbackRegistry.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/uti
>>> l/DefaultShutdownCallbackRegistry.java
>>> @@ -72,8 +72,13 @@ public class DefaultShutdownCallbackRegistry
>>> implements ShutdownCallbackRegistry
>>>              for (final Runnable hook : hooks) {
>>>                  try {
>>>                      hook.run();
>>> -                } catch (final Throwable t) {
>>> -                    LOGGER.error(SHUTDOWN_HOOK_MARKER, "Caught
>>> exception executing shutdown hook {}", hook, t);
>>> +                } catch (final Throwable t1) {
>>> +                    try {
>>> +                        LOGGER.error(SHUTDOWN_HOOK_MARKER, "Caught
>>> exception executing shutdown hook {}", hook, t1);
>>> +                    } catch (final Throwable t2) {
>>> +                        System.err.println("Caught exception logging
>>> exception");
>>> +                        t1.printStackTrace();
>>> +                    }
>>>                  }
>>>              }
>>>              state.set(State.STOPPED);
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b
>>> dac7f22/src/changes/changes.xml
>>> ----------------------------------------------------------------------
>>> diff --git a/src/changes/changes.xml b/src/changes/changes.xml
>>> index a6279b2..4fa7e54 100644
>>> --- a/src/changes/changes.xml
>>> +++ b/src/changes/changes.xml
>>> @@ -147,6 +147,9 @@
>>>        <action issue="LOG4J2-1687" dev="ggregory" type="fix"
>>> due-to="Robert Christiansen">
>>>          NPE in ThrowableProxy when resolving stack in Java EE/OSGi
>>> environment.
>>>        </action>
>>> +      <action issue="LOG4J2-1642" dev="ggregory" type="fix"
>>> due-to="Johno Crawford">
>>> +        DefaultShutdownCallbackRegistry can throw a
>>> NoClassDefFoundError.
>>> +      </action>
>>>        <action issue="LOG4J2-1644" dev="ggregory" type="update"
>>> due-to="Tim Gokcen, Pavel Sivolobtchik">
>>>          Inefficient locking in AbstractLoggerAdapter.
>>>        </action>
>>>
>>>
>>>
>>>
>>> --
>>> Matt Sicker <boa...@gmail.com>
>>>
>>>
>>>
>>
>>
>> --
>> Matt Sicker <boa...@gmail.com>
>>
>
>
>
> --
> Matt Sicker <boa...@gmail.com>
>



-- 
E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
Java Persistence with Hibernate, Second Edition
<https://www.amazon.com/gp/product/1617290459/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1617290459&linkCode=as2&tag=garygregory-20&linkId=cadb800f39946ec62ea2b1af9fe6a2b8>

<http:////ir-na.amazon-adsystem.com/e/ir?t=garygregory-20&l=am2&o=1&a=1617290459>
JUnit in Action, Second Edition
<https://www.amazon.com/gp/product/1935182021/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1935182021&linkCode=as2&tag=garygregory-20&linkId=31ecd1f6b6d1eaf8886ac902a24de418%22>

<http:////ir-na.amazon-adsystem.com/e/ir?t=garygregory-20&l=am2&o=1&a=1935182021>
Spring Batch in Action
<https://www.amazon.com/gp/product/1935182951/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1935182951&linkCode=%7B%7BlinkCode%7D%7D&tag=garygregory-20&linkId=%7B%7Blink_id%7D%7D%22%3ESpring+Batch+in+Action>
<http:////ir-na.amazon-adsystem.com/e/ir?t=garygregory-20&l=am2&o=1&a=1935182951>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Reply via email to