Sunday, June 7, 2015

NullPointerException on Weblogic server startup logs when deploying the applications which use log4j jar while calling (Category.removeAllAppenders())

Introduction:


While deploying an application which uses log4j jar, managed server startup logs display the exception as follows.

Exception:

java.lang.NullPointerException
at org.apache.log4j.Category.removeAllAppenders(Category.java:888)

Below is complete error stack trace.


log4j:ERROR Could not parse url [file:/opt/app/domains/domain_name/log4j.xml].
java.lang.NullPointerException
at org.apache.log4j.Category.removeAllAppenders(Category.java:888)
        at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:487)
        at org.apache.log4j.xml.DOMConfigurator.parseCategory(DOMConfigurator.java:415)
        at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:919)
        at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:790)
        at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:682)
        at org.apache.log4j.xml.XMLWatchdog.doOnChange(DOMConfigurator.java:1033)
        at org.apache.log4j.helpers.FileWatchdog.checkAndConfigure(FileWatchdog.java:89)
        at org.apache.log4j.helpers.FileWatchdog.<init>(FileWatchdog.java:58)
        at org.apache.log4j.xml.XMLWatchdog.<init>(DOMConfigurator.java:1025)
        at org.apache.log4j.xml.DOMConfigurator.configureAndWatch(DOMConfigurator.java:662)
        at org.apache.log4j.xml.DOMConfigurator.configureAndWatch(DOMConfigurator.java:645)
        at com.test.utility.Logger.<clinit>(Logger.java:35)
        at com.test.integration.mdbs.StartUp.<init>(StartUp.java:44)
        at com.test.integration.mdbs.StartUp_bco80w_Impl.<init>(StartUp_bco80w_Impl.java:45)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.lang.Class.newInstance0(Class.java:357)
        at java.lang.Class.newInstance(Class.java:310)
        at weblogic.ejb.container.manager.BaseEJBManager.createNewBeanInstance(BaseEJBManager.java:222)
        at weblogic.ejb.container.manager.BaseEJBManager.allocateBean(BaseEJBManager.java:233)
        at weblogic.ejb.container.manager.StatelessManager.createBean(StatelessManager.java:303)
        at weblogic.ejb.container.pool.StatelessSessionPool.createBean(StatelessSessionPool.java:190)
        at weblogic.ejb.container.pool.Pool.createInitialBeans(Pool.java:300)
        at weblogic.ejb.container.manager.StatelessManager.initializePool(StatelessManager.java:444)
        at weblogic.ejb.container.deployer.EJBDeployer.initializePools(EJBDeployer.java:1546)
        at weblogic.ejb.container.deployer.EJBDeployer.start(EJBDeployer.java:1377)
        at weblogic.ejb.container.deployer.EJBModule.start(EJBModule.java:589)
        at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:117)
        at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:204)
        at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:37)
        at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:60)
        at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:27)
        at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:635)
        at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:37)
        at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:212)
        at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:16)
        at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:162)
        at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:79)
        at weblogic.deploy.internal.targetserver.BasicDeployment.activate(BasicDeployment.java:184)
        at weblogic.deploy.internal.targetserver.BasicDeployment.activateFromServerLifecycle(BasicDeployment.java:361)
        at weblogic.management.deploy.internal.DeploymentAdapter$1.doActivate(DeploymentAdapter.java:51)
        at weblogic.management.deploy.internal.DeploymentAdapter.activate(DeploymentAdapter.java:196)
        at weblogic.management.deploy.internal.AppTransition$2.transitionApp(AppTransition.java:30)
        at weblogic.management.deploy.internal.ConfiguredDeployments.transitionApps(ConfiguredDeployments.java:233)
        at weblogic.management.deploy.internal.ConfiguredDeployments.activate(ConfiguredDeployments.java:169)
        at weblogic.management.deploy.internal.ConfiguredDeployments.deploy(ConfiguredDeployments.java:123)
        at weblogic.management.deploy.internal.DeploymentServerService.resume(DeploymentServerService.java:173)
        at weblogic.management.deploy.internal.DeploymentServerService.start(DeploymentServerService.java:89)
        at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)



Cause:


Code issue with the version of the log4j jar used. The method removeAllAppenders() does not have proper checks for NullPointerException. Please see more details in analysis section.



Analysis:


To analyze it have a look at log4j.jar placed at app server/lib and in my case I noticed that log4j-1.2.15.jar is at the path and tried to look to Category.java:888.

Below is screenshot of Category.java:888 in log4j-1.2.15.jar




The null pointer is coming at iter.hasMoreElements() at line 888 which indicates iter is null that means aai.getAllAppenders()is returning null value. In such case the null pointer can be avoided
by adding one more condition(highlighted below) to loop.

for (Enumeration iter = aai.getAllAppenders(); iter != null &&
iter.hasMoreElements();) {
appenders.add(iter.nextElement());
}



Solution:


I downloaded log4j-1.2.16.jar and extracted and verified the same Category.java and found that code is modified.

Below is screenshot of Category.java:888 in log4j-1.2.16.jar


By putting the newer version of log4j_1.2.16.jar in appserver/lib fixed the issue.

Hope above helps in fixing the above exception for your application, please leave your feedback or query.

No comments:

Post a Comment