We are using the HierarchyDynamicMBean Mbean to get all the log4j mbeans registered. We have a in built Monitoring, Logging and Debugging tool Mbean and we using HierarchyDynamicMBean to register it to the PlatformMBeanServer and the HTML Adaptor so that the MLD MBean appears in the log4j hiearchy. When we are setting the "priority" of this logger it sets the priority but prints the following message 477 All Attributes Not Set -------------------------------------------------------------------------------- 2/3 attribute(s) were not set: STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : Step one: From the eclipse launch the application code from the Source code for an executable test case section below. Step two: from the internet explorer launch http://localhost:9393 Step Three: In the log4J section of the page Select "logger=root" MBean , in its attribute page change the priority from DEBUG to WARN and click on apply button below and we get the following message as 477 All Attributes Not Set ACTUAL - 477 All Attributes Not Set ERROR MESSAGES/STACK TRACES THAT OCCUR : javax.management.AttributeNotFoundException: Attribute appender%3Dorg.apache.log4j.FileAppender@1c9a690 not found in org.apache.log4j.jmx.LoggerDynamicMBean at org.apache.log4j.jmx.LoggerDynamicMBean.setAttribute(LoggerDynamicMBean.java:242) at org.apache.log4j.jmx.AbstractDynamicMBean.setAttributes(AbstractDynamicMBean.java:118) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.setAttributes(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.setAttributes(JmxMBeanServer.java:728) at com.sun.jdmk.comm.HtmlObjectPage.setObjectValue(HtmlObjectPage.java:426) at com.sun.jdmk.comm.HtmlRequestHandler.processGetRequest(HtmlRequestHandler.java:301) at com.sun.jdmk.comm.HtmlRequestHandler.processRequest(HtmlRequestHandler.java:155) at com.sun.jdmk.comm.HtmlRequestHandler.doRun(HtmlRequestHandler.java:82) at com.sun.jdmk.comm.ClientHandler.run(ClientHandler.java:99) at java.lang.Thread.run(Thread.java:619) javax.management.AttributeNotFoundException: Attribute appender%3Dorg.apache.log4j.FileAppender@1c9a690 not found in org.apache.log4j.jmx.LoggerDynamicMBean at org.apache.log4j.jmx.LoggerDynamicMBean.setAttribute(LoggerDynamicMBean.java:242) at org.apache.log4j.jmx.AbstractDynamicMBean.setAttributes(AbstractDynamicMBean.java:118) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.setAttributes(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.setAttributes(JmxMBeanServer.java:728) at com.sun.jdmk.comm.HtmlObjectPage.setObjectValue(HtmlObjectPage.java:426) at com.sun.jdmk.comm.HtmlRequestHandler.processGetRequest(HtmlRequestHandler.java:301) at com.sun.jdmk.comm.HtmlRequestHandler.processRequest(HtmlRequestHandler.java:155) at com.sun.jdmk.comm.HtmlRequestHandler.doRun(HtmlRequestHandler.java:82) at com.sun.jdmk.comm.ClientHandler.run(ClientHandler.java:99) at java.lang.Thread.run(Thread.java:619) REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- This is the example source code that we have done outside our dev environment the following is the source code import java.io.IOException; import java.lang.management.ManagementFactory; import java.util.Vector; import javax.management.InstanceAlreadyExistsException; import javax.management.JMException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; import org.apache.log4j.Appender; import org.apache.log4j.FileAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.SimpleLayout; import org.apache.log4j.jmx.*; import com.sun.jdmk.comm.HtmlAdaptorServer; //import org.apache.log4j.BasicConfigurator; public class MyTestApp { private Vector dAttributes = new Vector(); private static Logger logger = Logger.getRootLogger(); static MBeanServer server = ManagementFactory.getPlatformMBeanServer(); private static Logger cat = Logger.getLogger(MyTestApp.class); // public MyTestApp(Logger logger) // { // super(logger); // // } public void go() throws Exception{ while(true){ logger.debug("DEBUG") ; logger.info("INFO") ; logger.warn("WARN"); logger.error("ERROR"); logger.fatal("FATAL"); Thread.sleep(2000); } } // void registerAppenderMBean1(Appender appender) { // String name = getAppenderName(appender); // cat.debug("Adding AppenderMBean for appender named "+name); // ObjectName objectName = null; // try { // AppenderDynamicMBean appenderMBean = new AppenderDynamicMBean(appender); // objectName = new ObjectName("log4j", "appender", name); // if (!server.isRegistered(objectName)) { // server.registerMBean(appenderMBean, objectName); // dAttributes.add(new MBeanAttributeInfo("appender=" + name, "javax.management.ObjectName", // "The " + name + " appender.", true, true, false)); // } // // } catch(JMException e) { // cat.error("Could not add appenderMBean for ["+name+"].", e); // } catch(java.beans.IntrospectionException e) { // cat.error("Could not add appenderMBean for ["+name+"].", e); // } catch(RuntimeException e) { // cat.error("Could not add appenderMBean for ["+name+"].", e); // } // } public static void main(String[] args) { //BasicConfigurator.configure(); org.apache.log4j.Layout layout = new SimpleLayout(); FileAppender appender = null; try { appender = new FileAppender(layout, "app.log"); } catch (IOException e1) { e1.printStackTrace(); } Logger logger = Logger.getRootLogger(); logger.addAppender(appender); MyTestApp app = new MyTestApp(); HierarchyDynamicMBean hdm = new HierarchyDynamicMBean(); try { ObjectName mbo = new ObjectName("log4j:hiearchy=root"); try { server.registerMBean(hdm, mbo); } catch (InstanceAlreadyExistsException e) { e.printStackTrace(); } catch (MBeanRegistrationException e) { e.printStackTrace(); } catch (NotCompliantMBeanException e) { e.printStackTrace(); } } catch (MalformedObjectNameException e1) { e1.printStackTrace(); } catch (NullPointerException e1) { e1.printStackTrace(); } // app.registerAppenderMBean1(appender); int portNumber=9393; //ObjectName htmlName = new ObjectName("log4j:hiearchy=default,port=" + portNumber) ; ObjectName htmlName = null; try { htmlName = new ObjectName("log4j:logger=root,port=" + portNumber); } catch (MalformedObjectNameException e1) { e1.printStackTrace(); } catch (NullPointerException e1) { e1.printStackTrace(); } //ObjectName htmlName = new ObjectName("jmxexample:type=MyApp,port=" + portNumber) ; HtmlAdaptorServer html = new HtmlAdaptorServer(portNumber); html.setPort(portNumber); try { server.registerMBean(html, htmlName); } catch (InstanceAlreadyExistsException e1) { e1.printStackTrace(); } catch (MBeanRegistrationException e1) { e1.printStackTrace(); } catch (NotCompliantMBeanException e1) { e1.printStackTrace(); } html.start(); try { app.go(); } catch (Exception e) { e.printStackTrace(); } } } ---------- END SOURCE ---------- Thanks Vilas
We are using log4j to implement dynamic logging in our application.
Any advice on the same.