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)

Reply via email to