Author: jfclere Date: Sun Apr 28 08:56:38 2013 New Revision: 1476736 URL: http://svn.apache.org/r1476736 Log: missing file from r1476728.
Added: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/log/UserDataHelper.java Added: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/log/UserDataHelper.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/log/UserDataHelper.java?rev=1476736&view=auto ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/log/UserDataHelper.java (added) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/log/UserDataHelper.java Sun Apr 28 08:56:38 2013 @@ -0,0 +1,149 @@ +/* + * 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.tomcat.util.log; + +import org.apache.juli.logging.Log; + +/** + * This helper class assists with the logging associated with invalid input + * data. A developer may want all instances of invalid input data logged to + * assist with debugging whereas in production it is likely to be desirable not + * to log anything for invalid data. The following settings may be used: + * <ul> + * <li>NOTHING: Log nothing.</li> + * <li>DEBUG_ALL: Log all problems at DEBUG log level.</li> + * <li>INFO_THEN_DEBUG: Log first problem at INFO log level and any further + * issues in the following TBD (configurable) seconds at DEBUG level</li> + * <li>INFO_ALL: Log all problems at INFO log level.</li> + * </ul> + * By default, INFO_THEN_DEBUG is used with a suppression time of 24 hours. + * + * NOTE: This class is not completely thread-safe. When using INFO_THEN_DEBUG it + * is possible that several INFO messages will be logged before dropping to + * DEBUG. + */ +public class UserDataHelper { + + private final Log log; + + private final Config config; + + // A value of 0 is equivalent to using INFO_ALL + // A negative value will trigger infinite suppression + // The value is milliseconds + private final long suppressionTime; + + private volatile long lastInfoTime = 0; + + + public UserDataHelper(Log log) { + this.log = log; + + Config tempConfig; + String configString = System.getProperty( + "org.apache.juli.logging.UserDataHelper.CONFIG"); + if (configString == null) { + tempConfig = Config.INFO_THEN_DEBUG; + } else { + try { + tempConfig = Config.valueOf(configString); + } catch (IllegalArgumentException iae) { + // Ignore - use default + tempConfig = Config.INFO_THEN_DEBUG; + } + } + + // Default suppression time of 1 day. + suppressionTime = Integer.getInteger( + "org.apache.juli.logging.UserDataHelper.SUPPRESSION_TIME", + 60 * 60 * 24).intValue() * 1000L; + + if (suppressionTime == 0) { + tempConfig = Config.INFO_ALL; + } + + config = tempConfig; + } + + + /** + * Returns log mode for the next log message, or <code>null</code> if the + * message should not be logged. + * + * <p> + * If <code>INFO_THEN_DEBUG</code> configuration option is enabled, this + * method might change internal state of this object. + * + * @return Log mode, or <code>null</code> + */ + public Mode getNextMode() { + if (Config.NONE == config) { + return null; + } else if (Config.DEBUG_ALL == config) { + return log.isDebugEnabled() ? Mode.DEBUG : null; + } else if (Config.INFO_THEN_DEBUG == config) { + if (logAtInfo()) { + return log.isInfoEnabled() ? Mode.INFO_THEN_DEBUG : null; + } else { + return log.isDebugEnabled() ? Mode.DEBUG : null; + } + } else if (Config.INFO_ALL == config) { + return log.isInfoEnabled() ? Mode.INFO : null; + } + // Should never happen + return null; + } + + + /* + * Not completely thread-safe but good enough for this use case. I couldn't + * see a simple enough way to make it completely thread-safe that was not + * likely to compromise performance. + */ + private boolean logAtInfo() { + + if (suppressionTime < 0 && lastInfoTime > 0) { + return false; + } + + long now = System.currentTimeMillis(); + + if (lastInfoTime + suppressionTime > now) { + return false; + } + + lastInfoTime = now; + return true; + } + + + private static enum Config { + NONE, + DEBUG_ALL, + INFO_THEN_DEBUG, + INFO_ALL + } + + /** + * Log mode for the next log message. + */ + public static enum Mode { + DEBUG, + INFO_THEN_DEBUG, + INFO + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org