[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>
* <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();
+ }
}
More information about the logback-dev
mailing list