hi,
There is a problem in MBean registration.
My program uses DOMConfigurator to configurate the initial loggers. A piece of
code is used to get the list of loggers and create MBean for each of them. The
whole thing works perfectly and allow me to change log level via MBean
interface *if the append doesn't overlap*. In my case, I use an appender for
the root and I use the same appender for my package (and set
additivity="false"). There is no problem for using without MBeans. However,
when creating the logger MBean (using hierarchyMBean.addLoggerMBean), my
"com.mycompany" MBean cannot be created because when it is trying to add the
MBean, it tries to create a AppenderMBean with the same objectName. Is it a bug
in log4j or did I do anything wrong?
The exception stacktrace, a simplified configuration, and the code to addMBean
are attached in this email.
Thank you very much.
Regards,
mingfai
XML Configuration (simplified)
------------------------------------------
<logger name="com.mycompany" additivity="false">
<level value="info" />
<appender-ref ref="ConsoleAppender"/> <!-- this duplicated Appender" caused
problem -->
<appender-ref ref="AnotherAppender"/>
</logger>
<root>
<priority value="info" />
<appender-ref ref="ConsoleAppender"/>
</root>
Code for creating MBean for each logger
---------------------------------------------------------
// add create MBean for every logger
Enumeration loggers = LogManager.getLoggerRepository()
.getCurrentLoggers();
Logger logger;
while (loggers.hasMoreElements()) {
logger = (Logger) loggers.nextElement();
if (logger.getName().matches(loggerPattern)) {
if (log.isDebugEnabled()) {
log.debug("To add logger: " + logger.getName());
}
hierarchyMBean.addLoggerMBean(logger.getName());
}
}
if (log.isInfoEnabled()) {
log.info("\t" + "initialized Loggers");
}
Exception
---------------
2006-06-25 13:19:35,944 [main] ERROR - Could not add appenderMBean for
[ConsoleAppender].
javax.management.InstanceAlreadyExistsException: log4j:appender=ConsoleAppender
at
com.sun.jmx.mbeanserver.RepositorySupport.addMBean(RepositorySupport.java:452)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.internal_addObject(DefaultMBeanServerInterceptor.java:1410)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:936)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:337)
at
com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:497)
at
org.apache.log4j.jmx.LoggerDynamicMBean.registerAppenderMBean(LoggerDynamicMBean.java:260)
at
org.apache.log4j.jmx.LoggerDynamicMBean.appenderMBeanRegistration(LoggerDynamicMBean.java:249)
at
org.apache.log4j.jmx.LoggerDynamicMBean.postRegister(LoggerDynamicMBean.java:276)
at
com.sun.jmx.mbeanserver.BaseMetaDataImpl.postRegisterInvoker(BaseMetaDataImpl.java:106)
at
com.sun.jmx.mbeanserver.MetaDataImpl.postRegisterInvoker(MetaDataImpl.java:244)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:948)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:337)
at
com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:497)
at
org.apache.log4j.jmx.HierarchyDynamicMBean.addLoggerMBean(HierarchyDynamicMBean.java:120)
at
org.apache.log4j.jmx.HierarchyDynamicMBean.addLoggerMBean(HierarchyDynamicMBean.java:108)
[my classes and methods are removed]
at
org.springframework.jmx.export.MBeanExporter.notifyListenersOfRegistration(MBeanExporter.java:913)
at
org.springframework.jmx.export.MBeanExporter.onRegister(MBeanExporter.java:895)
at
org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(MBeanRegistrationSupport.java:188)
at
org.springframework.jmx.export.MBeanExporter.registerMBean(MBeanExporter.java:620)
at
org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBeanExporter.java:598)
at
org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:576)
at
org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:496)
at
org.springframework.jmx.export.MBeanExporter.afterPropertiesSet(MBeanExporter.java:394)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:877)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:846)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:419)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:241)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:152)
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:253)
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:331)
at
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)
at
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)
[my classes and methods are removed]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)