Return-Path: Delivered-To: apmail-cocoon-cvs-archive@www.apache.org Received: (qmail 53541 invoked from network); 9 May 2009 09:40:25 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 9 May 2009 09:40:25 -0000 Received: (qmail 86673 invoked by uid 500); 9 May 2009 09:40:24 -0000 Delivered-To: apmail-cocoon-cvs-archive@cocoon.apache.org Received: (qmail 86583 invoked by uid 500); 9 May 2009 09:40:24 -0000 Mailing-List: contact cvs-help@cocoon.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@cocoon.apache.org list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list cvs@cocoon.apache.org Received: (qmail 86574 invoked by uid 99); 9 May 2009 09:40:24 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 09 May 2009 09:40:24 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 09 May 2009 09:40:13 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 3A82A23889CF; Sat, 9 May 2009 09:39:52 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r773186 - in /cocoon/cocoon3/trunk: cocoon-docs/src/changes/ cocoon-monitoring/src/main/java/org/ cocoon-monitoring/src/main/java/org/apache/ cocoon-monitoring/src/main/java/org/apache/cocoon/ cocoon-monitoring/src/main/java/org/apache/coco... Date: Sat, 09 May 2009 09:39:51 -0000 To: cvs@cocoon.apache.org From: reinhard@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090509093952.3A82A23889CF@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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. + + [cocoon-monitoring] Support logging reconfiguration via JMX + + [cocoon-optional] Add a formatting objects serializer using Apache FOP. 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 result = new ArrayList(); + + @SuppressWarnings("unchecked") + Enumeration 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 @@ + + + + + + + + + + + + + + + + + + + + + + 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