[ 
https://issues.apache.org/jira/browse/LOG4J2-1184?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14980453#comment-14980453
 ] 

Robert Veitch commented on LOG4J2-1184:
---------------------------------------

I tried with 2.4.1 and get the same stack trace. I also notice that it depends 
on which method I'm trying to log from. I can override and log from run() 
without incident, but logging from addShutdownCallback() causes the NPE. 
Adjusted sample class below:

public class CustomShutdownCallbackRegistry extends 
DefaultShutdownCallbackRegistry {
  private static Logger logger = 
LogManager.getLogger(CustomShutdownCallbackRegistry.class);

  public static void main(final String[] args) {}

  @Override
  public void run() {
    logger.info("run msg");
    super.run();
  }

  @Override
  public Cancellable addShutdownCallback(final Runnable callback) {
    // will throw NPE if uncommented
    // logger.info("addShutdownCallback msg");
    return super.addShutdownCallback(callback);
  }
}

Finally, I do observe that if I make the logger an instance variable rather 
than a static one, both log messages can complete successfully, which is 
different from what I originally reported. This seems to indicate that the 
custom callback registry object get initialized by the classloader at some 
point prior to when the logging subsystem is ready, and prior to when the 
actual instance is created?

> NullPointerException when attempting to configure logging in custom 
> ShutdownCallbackRegistry
> --------------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-1184
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1184
>             Project: Log4j 2
>          Issue Type: Bug
>    Affects Versions: 2.2
>         Environment: OSX, Ubuntu
>            Reporter: Robert Veitch
>            Priority: Minor
>
> I have a custom ShutdownCallbackRegistry implementation, which I've 
> configured to be instantiated via:
> -Dlog4j.shutdownCallbackRegistry=<my_implementation>
> If I configure a logger in the normal way, either via a static or instance 
> variable, I get a NullPointerException on startup. Something like:
> private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
> I think this is probably because the configured registry instance gets 
> created prior to the log4j subsystem responsible for loggers. My workaround 
> is to define the logger variable without assigning it:
> private static final Logger logger;
> And then assigning it as the first line of my run method:
> public void run() {
> logger = LoggerFactory.getLogger(MyClass.class);
> // shutdown registry code
> }
> But if possible, it seems like the instantiation order should be reworked so 
> that implementers of a custom registry do not have to do this.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to