[logback-dev] svn commit: r615 - logback/trunk/logback-access/src/main/java/ch/qos/logback/access/tomcat

noreply.seb at qos.ch noreply.seb at qos.ch
Tue Oct 3 10:53:47 CEST 2006


Author: seb
Date: Tue Oct  3 10:53:47 2006
New Revision: 615

Modified:
   logback/trunk/logback-access/src/main/java/ch/qos/logback/access/tomcat/LogbackValve.java

Log:
- added registration and jmx.

Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/tomcat/LogbackValve.java
==============================================================================
--- logback/trunk/logback-access/src/main/java/ch/qos/logback/access/tomcat/LogbackValve.java	(original)
+++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/tomcat/LogbackValve.java	Tue Oct  3 10:53:47 2006
@@ -4,13 +4,23 @@
 import java.io.IOException;
 import java.util.Iterator;
 
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
 import javax.servlet.ServletException;
 
 import org.apache.catalina.Contained;
 import org.apache.catalina.Container;
+import org.apache.catalina.Context;
+import org.apache.catalina.Engine;
+import org.apache.catalina.Host;
+import org.apache.catalina.Pipeline;
 import org.apache.catalina.Valve;
+import org.apache.catalina.Wrapper;
 import org.apache.catalina.connector.Request;
 import org.apache.catalina.connector.Response;
+import org.apache.catalina.core.ContainerBase;
 
 import ch.qos.logback.access.joran.JoranConfigurator;
 import ch.qos.logback.access.spi.AccessEvent;
@@ -28,10 +38,10 @@
  * LoggerContext does. It also provides containers for properties.
  * <p>
  * To configure tomcat in order to use LogbackValve, the following lines must be
- * added to the tomcat's server.xml:
- * 
+ * added to the tomcat's server.xml, nested in an <code>Engine</code> element:
+ * <p>
  * &lt;Valve className="ch.qos.logback.access.tomcat.LogbackValve"/&gt;
- * 
+ * <p>
  * By default, LogbackValve looks for a logback configuration file called
  * logback.xml, in the same folder where the tomcat configuration is located,
  * that is /conf/logback.xml. The logback.xml file is slightly different than
@@ -42,15 +52,15 @@
  * Here is a sample logback.xml file that can be used right away:
  * 
  * <pre>
- *     &lt;configuration&gt; 
- *       &lt;appender name=&quot;STDOUT&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&gt; 
- *         &lt;layout class=&quot;ch.qos.logback.access.PatternLayout&quot;&gt; 
- *           &lt;param name=&quot;Pattern&quot; value=&quot;%date %server %remoteIP %clientHost %user %requestURL &quot; /&gt;
- *         &lt;/layout&gt; 
- *       &lt;/appender&gt; 
- *       
- *       &lt;appender-ref ref=&quot;STDOUT&quot; /&gt; 
- *     &lt;/configuration&gt;
+ *        &lt;configuration&gt; 
+ *          &lt;appender name=&quot;STDOUT&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&gt; 
+ *            &lt;layout class=&quot;ch.qos.logback.access.PatternLayout&quot;&gt; 
+ *              &lt;param name=&quot;Pattern&quot; value=&quot;%date %server %remoteIP %clientHost %user %requestURL &quot; /&gt;
+ *            &lt;/layout&gt; 
+ *          &lt;/appender&gt; 
+ *          
+ *          &lt;appender-ref ref=&quot;STDOUT&quot; /&gt; 
+ *        &lt;/configuration&gt;
  * </pre>
  * 
  * A special, module-specific implementation of PatternLayout was implemented to
@@ -63,11 +73,16 @@
  * it's javadoc.
  * <p>
  * 
+ * <p>
+ * MBean registration parts of this class come from tomcat's ValveBase
+ * implementation.
+ * <p>
+ * 
  * @author Ceki G&uuml;lc&uuml;
  * @author S&eacute;bastien Pennec
  */
 public class LogbackValve extends ContextBase implements Valve, Contained,
-    AppenderAttachable {
+    AppenderAttachable, MBeanRegistration {
 
   public final static String DEFAULT_CONFIG_FILE = "conf" + File.separatorChar
       + "logback.xml";
@@ -178,4 +193,129 @@
   public void setContainer(Container container) {
     this.container = container;
   }
+
+  // -------------------- JMX and Registration --------------------
+  // MBean descriptions for custom components needed
+  // in order to avoid a "ManagedBean is not found" exception.
+
+  protected String domain;
+  protected ObjectName oname;
+  protected MBeanServer mserver;
+  protected ObjectName controller;
+
+  public ObjectName getObjectName() {
+    return oname;
+  }
+
+  public void setObjectName(ObjectName oname) {
+    this.oname = oname;
+  }
+
+  public String getDomain() {
+    return domain;
+  }
+
+  public ObjectName preRegister(MBeanServer server, ObjectName name)
+      throws Exception {
+    oname = name;
+    mserver = server;
+    domain = name.getDomain();
+
+    return name;
+  }
+
+  public void postRegister(Boolean registrationDone) {
+  }
+
+  public void preDeregister() throws Exception {
+  }
+
+  public void postDeregister() {
+  }
+
+  public ObjectName getController() {
+    return controller;
+  }
+
+  public void setController(ObjectName controller) {
+    this.controller = controller;
+  }
+
+  /**
+   * From the name, extract the parent object name
+   * 
+   * @param valveName
+   *          The valve name
+   * @return ObjectName The parent name
+   */
+  public ObjectName getParentName(ObjectName valveName) {
+
+    return null;
+  }
+
+  public ObjectName createObjectName(String domain, ObjectName parent)
+      throws MalformedObjectNameException {
+    Container container = this.getContainer();
+    if (container == null || !(container instanceof ContainerBase))
+      return null;
+    ContainerBase containerBase = (ContainerBase) container;
+    Pipeline pipe = containerBase.getPipeline();
+    Valve valves[] = pipe.getValves();
+
+    /* Compute the "parent name" part */
+    String parentName = "";
+    if (container instanceof Engine) {
+    } else if (container instanceof Host) {
+      parentName = ",host=" + container.getName();
+    } else if (container instanceof Context) {
+      String path = ((Context) container).getPath();
+      if (path.length() < 1) {
+        path = "/";
+      }
+      Host host = (Host) container.getParent();
+      parentName = ",path=" + path + ",host=" + host.getName();
+    } else if (container instanceof Wrapper) {
+      Context ctx = (Context) container.getParent();
+      String path = ctx.getPath();
+      if (path.length() < 1) {
+        path = "/";
+      }
+      Host host = (Host) ctx.getParent();
+      parentName = ",servlet=" + container.getName() + ",path=" + path
+          + ",host=" + host.getName();
+    }
+
+    String className = this.getClass().getName();
+    int period = className.lastIndexOf('.');
+    if (period >= 0)
+      className = className.substring(period + 1);
+
+    int seq = 0;
+    for (int i = 0; i < valves.length; i++) {
+      // Find other valves with the same name
+      if (valves[i] == this) {
+        break;
+      }
+      if (valves[i] != null && valves[i].getClass() == this.getClass()) {
+
+        seq++;
+      }
+    }
+    String ext = "";
+    if (seq > 0) {
+      ext = ",seq=" + seq;
+    }
+
+    ObjectName objectName = new ObjectName(domain + ":type=Valve,name="
+        + className + ext + parentName);
+    return objectName;
+  }
+
+  // -------------------- JMX data --------------------
+
+  public ObjectName getContainerName() {
+    if (container == null)
+      return null;
+    return ((ContainerBase) container).getJmxName();
+  }
 }



More information about the logback-dev mailing list