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

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> * <Valve className="ch.qos.logback.access.tomcat.LogbackValve"/> - * + * <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> - * <configuration> - * <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> - * <layout class="ch.qos.logback.access.PatternLayout"> - * <param name="Pattern" value="%date %server %remoteIP %clientHost %user %requestURL " /> - * </layout> - * </appender> - * - * <appender-ref ref="STDOUT" /> - * </configuration> + * <configuration> + * <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + * <layout class="ch.qos.logback.access.PatternLayout"> + * <param name="Pattern" value="%date %server %remoteIP %clientHost %user %requestURL " /> + * </layout> + * </appender> + * + * <appender-ref ref="STDOUT" /> + * </configuration> * </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ülcü * @author Sé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(); + } }
participants (1)
-
noreply.seb@qos.ch