log4j2 exception:ERROR 无法注销 org.apache.logging.log4j2:type=AsyncContext@694ae32f,component=AsyncLoggerRingBuffer 的 MBean

log4j2 exception:ERROR Could not unregister MBeans for org.apache.logging.log4j2:type=AsyncContext@694ae32f,component=AsyncLoggerRingBuffer

我在 weblogic 10.3.x 应用程序启动时看到异常。 Log4j2 版本:2.6.1

下面提到了我正在使用的 log4j xml 配置和堆栈跟踪。

Log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" >
      <Properties>
        <Property name="theHostName">${hostName}</Property>
      </Properties>
      <Appenders>
            <RollingFile name="FILE" filename="${sys:weblogic.Name}.log" filepattern="${sys:weblogic.Name}.log.%i" append="true" >
                <PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss,SSS}][${sys:weblogic.Name}:${hostName}][%t][%X{MessageInfo}][%c{1}:%M:%L][%msg]%n" />
                <Policies>
                    <SizeBasedTriggeringPolicy size="50 MB" />
                </Policies>
                <DefaultRolloverStrategy max="100" fileIndex="min"/>
            </RollingFile>
      </Appenders>
      <Loggers>
            <AsyncLogger level="INFO" name="com.company" includeLocation="true" additivity="false">
              <AppenderRef ref="FILE"/>
            </AsyncLogger>
            <Root level="INFO" includeLocation="true">
              <AppenderRef ref="FILE"/>
            </Root>
            <!--  Package specific log level defines -->
            <Logger level="WARN" name="org.springframework" />
            <Logger level="WARN" name="org.jboss" />
            <Logger level="OFF" name="org.hibernate" />
            <Logger level="WARN" name="com.company.project.eligibility" />
      </Loggers>
</Configuration>

服务器启动开始时出现异常:

2016-08-26 02:19:15,172 [ACTIVE] ExecuteThread: '13' for queue: 
 'weblogic.kernel.Default (self-tuning)' ERROR Could not 
 unregister MBeans for org.apache.logging.log4j2:type=AsyncContext@694ae32f,
 component=AsyncLoggerRingBuffer javax.management.InstanceNotFoundException: 
 org.apache.logging.log4j2:type=AsyncContext@694ae32f,
 component=AsyncLoggerRingBuffer
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.exclusiveUnregisterMBean(DefaultMBeanServerInterceptor.java:427)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.unregisterMBean(DefaultMBeanServerInterceptor.java:415)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.unregisterMBean(JmxMBeanServer.java:546)
        at org.apache.logging.log4j.core.jmx.Server.unregisterAllMatching(Server.java:335)
        at org.apache.logging.log4j.core.jmx.Server.unregisterAsyncLoggerRingBufferAdmins(Server.java:316)
        at org.apache.logging.log4j.core.jmx.Server.unregisterLoggerContext(Server.java:258)
        at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:162)
        at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:138)
        at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:502)
        at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:561)
        at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:577)
        at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:212)
        at org.apache.logging.log4j.core.async.AsyncLoggerContext.start(AsyncLoggerContext.java:75)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:152)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
        at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
        at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:551)
        at com.company.tns.netmessage.bean.NetMessageListener.<clinit>(NetMessageListener.java:55)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at java.lang.Class.newInstance(Class.java:383)
        at com.oracle.pitchfork.spi.bean.internal.GeneralBeanManager.getBean(GeneralBeanManager.java:22)
        at com.oracle.pitchfork.spi.EjbComponentCreatorBrokerImpl.getBean(EjbComponentCreatorBrokerImpl.java:82)
        at weblogic.ejb.container.injection.EjbComponentCreatorImpl.getBean(EjbComponentCreatorImpl.java:57)
        at weblogic.ejb.container.manager.BaseEJBManager.createNewBeanInstance(BaseEJBManager.java:220)
        at weblogic.ejb.container.manager.BaseEJBManager.allocateBean(BaseEJBManager.java:235)
        at weblogic.ejb.container.manager.MessageDrivenManager.createBean(MessageDrivenManager.java:301)
        at weblogic.ejb.container.pool.MessageDrivenPool.createBean(MessageDrivenPool.java:174)
        at weblogic.ejb.container.pool.Pool.createInitialBeans(Pool.java:299)
        at weblogic.ejb.container.manager.MessageDrivenManager.start(MessageDrivenManager.java:655)
        at weblogic.ejb.container.deployer.MessageDrivenBeanInfoImpl$DestinationResovler.activateNoneDDMDManager(MessageDrivenBeanInfoImpl.java:2356)
        at weblogic.ejb.container.deployer.MessageDrivenBeanInfoImpl$QueueConnectionHandler.handleNoneDD(MessageDrivenBeanInfoImpl.java:2798)
        at weblogic.ejb.container.deployer.MessageDrivenBeanInfoImpl$DestinationResovler.resolveDestnationWorkMode(MessageDrivenBeanInfoImpl.java:2289)
        at weblogic.ejb.container.deployer.MessageDrivenBeanInfoImpl$DestinationEventHandler.onDestinationsAvailable(MessageDrivenBeanInfoImpl.java:2112)
        at weblogic.jms.extensions.JMSDestinationAvailabilityHelper$DestinationAvailabilityListenerWrapper.run(JMSDestinationAvailabilityHelper.java:386)
        at weblogic.jms.extensions.JMSDestinationAvailabilityHelper$DestinationAvailabilityListenerWrapper.callOutListener(JMSDestinationAvailabilityHelper.java:402)
        at weblogic.jms.extensions.JMSDestinationAvailabilityHelper$DestinationAvailabilityListenerWrapper.onDDMembershipChange(JMSDestinationAvailabilityHelper.java:383)
        at weblogic.jms.common.CDS$DD2Listener.run(CDS.java:1264)
        at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:545)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

这个 Cryptic 错误是什么意思,我该如何解决?

该错误表示当 log4j 尝试注销尚未注册的 JMX MBean 时,Weblogic 停止运行。

Log4j 捕获此错误并将其记录在错误级别,包括堆栈跟踪。然后应用程序继续执行它的工作。所以没有真正的问题,这更像是一个嘈杂的警报。

您可以尝试通过设置系统 属性 log4j2.disable.jmx=true 告诉 log4j 禁用 JMX 来减少噪音。

此外,您可能会争辩说 log4j 应该更改错误处理以显示看起来不那么可怕的消息。您可以在 log4j2 Jira 问题跟踪器上请求此更改。


更新:

我针对这个问题提出了https://issues.apache.org/jira/browse/LOG4J2-1581。 这现在已在 master 中修复,并将包含在下一个版本 Log4j 2.7 中。