[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xml-cocoon-cvs
Subject:    svn commit: r773186 - in /cocoon/cocoon3/trunk: cocoon-docs/src/changes/
From:       reinhard () apache ! org
Date:       2009-05-09 9:39:51
Message-ID: 20090509093952.3A82A23889CF () eris ! apache ! org
[Download RAW message or body]

Author: reinhard
Date: Sat May  9 09:39:50 2009
New Revision: 773186

URL: http://svn.apache.org/viewvc?rev=773186&view=rev
Log:
Initial work of Dariusz on supporting logging reconfiguration via JMX

Added:
    cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/
    cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/
    cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/
    cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/
  cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/Log4JReconfigurator.java \
(with props)  cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/LoggingConfigurationResetter.java \
(with props)  cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/
    cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/
    cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/
    cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/spring/
    cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/spring/cocoon-monitoring.xml \
(with props) Modified:
    cocoon/cocoon3/trunk/cocoon-docs/src/changes/changes.xml
    cocoon/cocoon3/trunk/cocoon-sample/rcl.properties

Modified: cocoon/cocoon3/trunk/cocoon-docs/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-docs/src/changes/changes.xml?rev=773186&r1=773185&r2=773186&view=diff
 ==============================================================================
--- cocoon/cocoon3/trunk/cocoon-docs/src/changes/changes.xml (original)
+++ cocoon/cocoon3/trunk/cocoon-docs/src/changes/changes.xml Sat May  9 09:39:50 2009
@@ -132,6 +132,10 @@
         annotations. 
       </action>
 
+      <action dev="reinhard" type="add" due-to="Dariusz Luksza">
+        [cocoon-monitoring] Support logging reconfiguration via JMX
+      </action>
+             
       <action dev="reinhard" type="add" issue="COCOON3-7" due-to="Simone Tripodi">
         [cocoon-optional] Add a formatting objects serializer using Apache FOP.
       </action>       

Added: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/Log4JReconfigurator.java
                
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/Log4JReconfigurator.java?rev=773186&view=auto
 ==============================================================================
--- cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/Log4JReconfigurator.java \
                (added)
+++ cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/Log4JReconfigurator.java \
Sat May  9 09:39:50 2009 @@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.monitoring;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.spi.LoggerRepository;
+import org.springframework.jmx.export.annotation.ManagedAttribute;
+import org.springframework.jmx.export.annotation.ManagedOperation;
+import org.springframework.jmx.export.annotation.ManagedOperationParameter;
+import org.springframework.jmx.export.annotation.ManagedOperationParameters;
+import org.springframework.jmx.export.annotation.ManagedResource;
+
+@ManagedResource
+public class Log4JReconfigurator {
+
+    private LoggerRepository loggerRepository;
+
+    public Log4JReconfigurator() {
+        this.loggerRepository = LogManager.getLoggerRepository();
+    }
+
+    @ManagedAttribute(description = "Return a list of all configured loggers with \
their level.") +    public String[] getLoggers() {
+        List<String> result = new ArrayList<String>();
+
+        @SuppressWarnings("unchecked")
+        Enumeration<Logger> currentLoggers = \
this.loggerRepository.getCurrentLoggers(); +        while \
(currentLoggers.hasMoreElements()) { +            Logger tmpLogger = \
currentLoggers.nextElement(); +            if (tmpLogger.getLevel() != null) {
+                result.add(tmpLogger.getName() + ": " + tmpLogger.getLevel());
+            }
+        }
+
+        return result.toArray(new String[] {});
+    }
+
+    @ManagedOperation(description = "Sets logging level for a paticular package or a \
class. Returns true if operation was succesful.") +    \
@ManagedOperationParameters(value = { +            @ManagedOperationParameter(name = \
"category", description = "Name of the log category (usually a package or class name) \
whose log level should be changed."), +            @ManagedOperationParameter(name = \
"newLevel", description = "New log level for that category. Avaliable log levels are: \
OFF, INFO, WARN, ERROR, FATAL, TRACE, DEBUG, ALL") }) +    public boolean \
setLoggingLevel(String category, String newLogLevel) { +        boolean result = \
false; +
+        Logger logger = this.loggerRepository.getLogger(category);
+        if (logger != null) {
+            logger.setLevel(Level.toLevel(newLogLevel.toUpperCase()));
+            result = true;
+        }
+
+        return result;
+    }
+
+    @ManagedOperation(description = "Sets new logging level for amout of time. After \
timeout log level is set back to old value.") +    @ManagedOperationParameters(value \
= { +            @ManagedOperationParameter(name = "category", description = "Name of \
the log category (usually a package or class name) whose log level should be \
changed."), +            @ManagedOperationParameter(name = "temporalLevel", \
description = "Temporal log level for that category that should be set for specified \
amout of time."), +            @ManagedOperationParameter(name = "timeOut", \
description = "Amount of time that temporalLevel should be active. Value of timeOut \
should match regex: ^[0-9.]+[dhm]?$ where 'd' means day, 'h' hours and 'm' minutes") \
}) +    public boolean setLoggingTempoporalLevel(String category, String \
temporalLogLevel, String timeOut) { +        if (!timeOut.matches("^[0-9.]+[dhm]?$")) \
{ +            throw new UnsupportedOperationException("Unsupported time out format: \
" + timeOut); +        }
+
+        boolean result = false;
+        Logger logger = this.loggerRepository.getLogger(category);
+        if (logger != null) {
+            Level oldLevel = logger.getLevel();
+            LoggingConfigurationResetter restoreThread = new \
LoggingConfigurationResetter(logger, oldLevel, timeOut +                    \
.toLowerCase()); +            logger.setLevel(Level.toLevel(temporalLogLevel));
+            restoreThread.start();
+            result = true;
+        }
+
+        return result;
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/Log4JReconfigurator.java
                
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/LoggingConfigurationResetter.java
                
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java \
/org/apache/cocoon/monitoring/LoggingConfigurationResetter.java?rev=773186&view=auto \
                ==============================================================================
                
--- cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/LoggingConfigurationResetter.java \
                (added)
+++ cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/LoggingConfigurationResetter.java \
Sat May  9 09:39:50 2009 @@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.monitoring;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+public class LoggingConfigurationResetter {
+
+    private long delay;
+    private Logger logger;
+    private Level oldLogLevel;
+
+    public LoggingConfigurationResetter(final Logger logger, final Level oldLevel, \
String timeout) { +
+        this.logger = logger;
+        this.oldLogLevel = oldLevel;
+
+        long factor;
+        char unit = timeout.charAt(timeout.length() - 1); // get last char, it \
should be our unit +        switch (unit) {
+        case 'm': // minute
+            factor = 60 * 1000;
+            break;
+        case 'h': // hour
+            factor = 60 * 60 * 1000;
+            break;
+        case 'd': // day
+            factor = 24 * 60 * 60 * 1000;
+            break;
+        default:
+            throw new UnsupportedOperationException("Unsupporterd unit: " + unit);
+        }
+
+        float multipler = Float.parseFloat(timeout.substring(0, timeout.length() - \
1)); +        this.delay = Math.round(multipler * factor);
+
+    }
+
+    public void start() {
+        TimerTask task = new TimerTask() {
+            @Override
+            public void run() {
+                LoggingConfigurationResetter.this.logger.setLevel(LoggingConfigurationResetter.this.oldLogLevel);
 +            }
+
+            @Override
+            public boolean cancel() {
+                this.run(); // set old level on task cancel
+                return super.cancel();
+            }
+        };
+
+        Timer timer = new Timer("Restore " + this.logger.getName() + " to level" + \
this.oldLogLevel, true); +        timer.schedule(task, this.delay);
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/LoggingConfigurationResetter.java
                
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/LoggingConfigurationResetter.java
                
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/java/org/apache/cocoon/monitoring/LoggingConfigurationResetter.java
                
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/spring/cocoon-monitoring.xml
                
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/spring/cocoon-monitoring.xml?rev=773186&view=auto
 ==============================================================================
--- cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/spring/cocoon-monitoring.xml \
                (added)
+++ cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/spring/cocoon-monitoring.xml \
Sat May  9 09:39:50 2009 @@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans \
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> +
+  <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
+    <property name="assembler" ref="org.apache.cocoon.monitoring.assembler" />
+    <property name="namingStrategy" \
ref="org.apache.cocoon.monitoring.namingStrategy" /> +    <property name="autodetect" \
value="true" /> +  </bean>
+
+  <bean id="org.apache.cocoon.monitoring.jmxAttributeSource"
+    class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" \
/> +
+  <bean id="org.apache.cocoon.monitoring.assembler" \
class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> +    \
<property name="attributeSource" \
ref="org.apache.cocoon.monitoring.jmxAttributeSource" /> +  </bean>
+
+  <bean id="org.apache.cocoon.monitoring.namingStrategy" \
class="org.springframework.jmx.export.naming.MetadataNamingStrategy"> +    <property \
name="attributeSource" ref="org.apache.cocoon.monitoring.jmxAttributeSource" /> +  \
</bean> +  
+  <bean id="org.apache.cocoon.monitoring.Log4JReconfigurator"
+    class="org.apache.cocoon.monitoring.Log4JReconfigurator" scope="singleton" />
+</beans>

Propchange: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/spring/cocoon-monitoring.xml
                
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/spring/cocoon-monitoring.xml
                
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-monitoring/src/main/resources/META-INF/cocoon/spring/cocoon-monitoring.xml
                
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: cocoon/cocoon3/trunk/cocoon-sample/rcl.properties
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/rcl.properties?rev=773186&r1=773185&r2=773186&view=diff
 ==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/rcl.properties (original)
+++ cocoon/cocoon3/trunk/cocoon-sample/rcl.properties Sat May  9 09:39:50 2009
@@ -15,3 +15,7 @@
 # limitations under the License.
 #
 org.apache.cocoon.sample.servlet%classes-dir=./target/classes
+
+# cocoon-monitoring
+%classes-dir=../cocoon-monitoring/target/classes
+%exclude-lib=org.apache.cocoon.monitoring:cocoon-monitoring


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic