diff options
author | Greg Wilkins | 2015-09-25 04:08:31 +0000 |
---|---|---|
committer | Greg Wilkins | 2015-09-25 04:08:31 +0000 |
commit | 007ac4a9ddd5e10383d28978fff895eca167415d (patch) | |
tree | 9ee361365c1ef6fc72ba254e3c4de27b159d6aa2 /jetty-util/src/main | |
parent | dcb4c0d0a8ecb2d198977334b8b6a8c6180359b5 (diff) | |
download | org.eclipse.jetty.project-007ac4a9ddd5e10383d28978fff895eca167415d.tar.gz org.eclipse.jetty.project-007ac4a9ddd5e10383d28978fff895eca167415d.tar.xz org.eclipse.jetty.project-007ac4a9ddd5e10383d28978fff895eca167415d.zip |
478372 - JavaUtilLog setSourceClass and setSourceMethod
Added some additional features to configure the java.util.logging mechansim
Diffstat (limited to 'jetty-util/src/main')
4 files changed, 237 insertions, 160 deletions
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/AbstractLogger.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/AbstractLogger.java index 4ea47712fe..5571d63896 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/AbstractLogger.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/AbstractLogger.java @@ -18,6 +18,7 @@ package org.eclipse.jetty.util.log; +import java.util.Properties; /* ------------------------------------------------------------ */ /** Abstract Logger. @@ -25,6 +26,13 @@ package org.eclipse.jetty.util.log; */ public abstract class AbstractLogger implements Logger { + public static final int LEVEL_DEFAULT = -1; + public static final int LEVEL_ALL = 0; + public static final int LEVEL_DEBUG = 1; + public static final int LEVEL_INFO = 2; + public static final int LEVEL_WARN = 3; + public static final int LEVEL_OFF = 10; + @Override public final Logger getLogger(String name) { @@ -76,6 +84,137 @@ public abstract class AbstractLogger implements Logger return true; } + /** + * Get the Logging Level for the provided log name. Using the FQCN first, then each package segment from longest to + * shortest. + * + * @param props + * the properties to check + * @param name + * the name to get log for + * @return the logging level + */ + public static int lookupLoggingLevel(Properties props, final String name) + { + if ((props == null) || (props.isEmpty()) || name==null ) + return LEVEL_DEFAULT; + + // Calculate the level this named logger should operate under. + // Checking with FQCN first, then each package segment from longest to shortest. + String nameSegment = name; + + while ((nameSegment != null) && (nameSegment.length() > 0)) + { + String levelStr = props.getProperty(nameSegment + ".LEVEL"); + // System.err.printf("[StdErrLog.CONFIG] Checking for property [%s.LEVEL] = %s%n",nameSegment,levelStr); + int level = getLevelId(nameSegment + ".LEVEL",levelStr); + if (level != (-1)) + { + return level; + } + + // Trim and try again. + int idx = nameSegment.lastIndexOf('.'); + if (idx >= 0) + { + nameSegment = nameSegment.substring(0,idx); + } + else + { + nameSegment = null; + } + } + + // Default Logging Level + return LEVEL_DEFAULT; + } + + + public static String getLoggingProperty(Properties props, String name, String property) + { + // Calculate the level this named logger should operate under. + // Checking with FQCN first, then each package segment from longest to shortest. + String nameSegment = name; + + while ((nameSegment != null) && (nameSegment.length() > 0)) + { + String s = props.getProperty(nameSegment+"."+property); + if (s!=null) + return s; + + // Trim and try again. + int idx = nameSegment.lastIndexOf('.'); + nameSegment = (idx >= 0)?nameSegment.substring(0,idx):null; + } + + return null; + } + + + protected static int getLevelId(String levelSegment, String levelName) + { + if (levelName == null) + { + return -1; + } + String levelStr = levelName.trim(); + if ("ALL".equalsIgnoreCase(levelStr)) + { + return LEVEL_ALL; + } + else if ("DEBUG".equalsIgnoreCase(levelStr)) + { + return LEVEL_DEBUG; + } + else if ("INFO".equalsIgnoreCase(levelStr)) + { + return LEVEL_INFO; + } + else if ("WARN".equalsIgnoreCase(levelStr)) + { + return LEVEL_WARN; + } + else if ("OFF".equalsIgnoreCase(levelStr)) + { + return LEVEL_OFF; + } + + System.err.println("Unknown StdErrLog level [" + levelSegment + "]=[" + levelStr + "], expecting only [ALL, DEBUG, INFO, WARN, OFF] as values."); + return -1; + } + + + /** + * Condenses a classname by stripping down the package name to just the first character of each package name + * segment.Configured + * + * <pre> + * Examples: + * "org.eclipse.jetty.test.FooTest" = "oejt.FooTest" + * "org.eclipse.jetty.server.logging.LogTest" = "orjsl.LogTest" + * </pre> + * + * @param classname + * the fully qualified class name + * @return the condensed name + */ + protected static String condensePackageString(String classname) + { + String parts[] = classname.split("\\."); + StringBuilder dense = new StringBuilder(); + for (int i = 0; i < (parts.length - 1); i++) + { + dense.append(parts[i].charAt(0)); + } + if (dense.length() > 0) + { + dense.append('.'); + } + dense.append(parts[parts.length - 1]); + return dense.toString(); + } + + public void debug(String msg, long arg) { if (isDebugEnabled()) diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/JavaUtilLog.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/JavaUtilLog.java index 53b28165e3..2baa001bf4 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/JavaUtilLog.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/JavaUtilLog.java @@ -18,9 +18,15 @@ package org.eclipse.jetty.util.log; +import java.net.URL; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.logging.Level; +import java.util.logging.LogManager; import java.util.logging.LogRecord; +import org.eclipse.jetty.util.Loader; + /** * <p> * Implementation of Jetty {@link Logger} based on {@link java.util.logging.Logger}. @@ -33,6 +39,18 @@ import java.util.logging.LogRecord; * * Configuration Properties: * <dl> + * <dt>${name|hierarchy}.LEVEL=(ALL|DEBUG|INFO|WARN|OFF)</dt> + * <dd> + * Sets the level that the Logger should log at.<br> + * Names can be a package name, or a fully qualified class name.<br> + * Default: The default from the java.util.logging mechanism/configuration + * <br> + * <dt>org.eclipse.jetty.util.log.javautil.PROPERTIES=<property-resource-name></dt> + * <dd>If set, it is used as a classpath resource name to find a java.util.logging + * property file. + * <br> + * Default: null + * </dd> * <dt>org.eclipse.jetty.util.log.javautil.SOURCE=(true|false)</dt> * <dd>Set the LogRecord source class and method for JavaUtilLog.<br> * Default: true @@ -50,22 +68,73 @@ public class JavaUtilLog extends AbstractLogger Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.SOURCE", Log.__props.getProperty("org.eclipse.jetty.util.log.javautil.SOURCE","true"))); + private static boolean _initialized=false; + private Level configuredLevel; private java.util.logging.Logger _logger; public JavaUtilLog() { - this("org.eclipse.jetty.util.log"); + this("org.eclipse.jetty.util.log.javautil"); } public JavaUtilLog(String name) { + synchronized (JavaUtilLog.class) + { + if (!_initialized) + { + _initialized=true; + + final String properties=Log.__props.getProperty("org.eclipse.jetty.util.log.javautil.PROPERTIES",null); + if (properties!=null) + { + AccessController.doPrivileged(new PrivilegedAction<Object>() + { + public Object run() + { + try + { + URL props = Loader.getResource(JavaUtilLog.class,properties); + if (props != null) + LogManager.getLogManager().readConfiguration(props.openStream()); + } + catch(Throwable e) + { + System.err.println("[WARN] Error loading logging config: " + properties); + e.printStackTrace(System.err); + } + + return null; + } + }); + } + } + } + _logger = java.util.logging.Logger.getLogger(name); - if (Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.DEBUG", "false"))) + + switch(lookupLoggingLevel(Log.__props,name)) { - _logger.setLevel(Level.FINE); + case LEVEL_ALL: + _logger.setLevel(Level.ALL); + break; + case LEVEL_DEBUG: + _logger.setLevel(Level.FINE); + break; + case LEVEL_INFO: + _logger.setLevel(Level.INFO); + break; + case LEVEL_WARN: + _logger.setLevel(Level.WARNING); + break; + case LEVEL_OFF: + _logger.setLevel(Level.OFF); + break; + case LEVEL_DEFAULT: + default: + break; } - configuredLevel = _logger.getLevel(); } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/Log.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/Log.java index 70db7539f1..396b95b268 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/Log.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/Log.java @@ -130,7 +130,7 @@ public class Log }); } - private static void loadProperties(String resourceName, Properties props) + static void loadProperties(String resourceName, Properties props) { URL testProps = Loader.getResource(Log.class,resourceName); if (testProps != null) diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java index 56eb174d4b..079e9952af 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java @@ -21,6 +21,7 @@ package org.eclipse.jetty.util.log; import java.io.PrintStream; import java.security.AccessControlException; import java.util.Properties; +import java.util.logging.Level; import org.eclipse.jetty.util.DateCache; import org.eclipse.jetty.util.annotation.ManagedAttribute; @@ -96,19 +97,14 @@ public class StdErrLog extends AbstractLogger // Do not change output format lightly, people rely on this output format now. private static int __tagpad = Integer.parseInt(Log.__props.getProperty("org.eclipse.jetty.util.log.StdErrLog.TAG_PAD","0")); private static DateCache _dateCache; - private static final Properties __props = new Properties(); private final static boolean __source = Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.SOURCE", Log.__props.getProperty("org.eclipse.jetty.util.log.stderr.SOURCE","false"))); private final static boolean __long = Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.stderr.LONG","false")); private final static boolean __escape = Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.stderr.ESCAPE","true")); - - static { - __props.putAll(Log.__props); - String deprecatedProperties[] = { "DEBUG", "org.eclipse.jetty.util.log.DEBUG", "org.eclipse.jetty.util.log.stderr.DEBUG" }; @@ -136,11 +132,6 @@ public class StdErrLog extends AbstractLogger __tagpad=pad; } - public static final int LEVEL_ALL = 0; - public static final int LEVEL_DEBUG = 1; - public static final int LEVEL_INFO = 2; - public static final int LEVEL_WARN = 3; - public static final int LEVEL_OFF = 10; private int _level = LEVEL_INFO; // Level that this Logger was configured as (remembered in special case of .setDebugEnabled()) @@ -155,6 +146,20 @@ public class StdErrLog extends AbstractLogger private final String _abbrevname; private boolean _hideStacks = false; + + public static int getLoggingLevel(Properties props,String name) + { + int level = lookupLoggingLevel(props,name); + if (level==LEVEL_DEFAULT) + { + level = lookupLoggingLevel(props,"log"); + if (level==LEVEL_DEFAULT) + level=LEVEL_INFO; + } + return level; + } + + /** * Obtain a StdErrLog reference for the specified class, a convenience method used most often during testing to allow for control over a specific logger. * <p> @@ -194,7 +199,7 @@ public class StdErrLog extends AbstractLogger */ public StdErrLog(String name) { - this(name,__props); + this(name,null); } /** @@ -207,16 +212,16 @@ public class StdErrLog extends AbstractLogger */ public StdErrLog(String name, Properties props) { - if (props!=null && props!=__props) - __props.putAll(props); - this._name = name == null?"":name; - this._abbrevname = condensePackageString(this._name); - this._level = getLoggingLevel(props,this._name); - this._configuredLevel = this._level; + if (props!=null && props!=Log.__props) + Log.__props.putAll(props); + _name = name == null?"":name; + _abbrevname = condensePackageString(this._name); + _level = getLoggingLevel(Log.__props,this._name); + _configuredLevel = _level; try { - String source = getLoggingProperty(props,_name,"SOURCE"); + String source = getLoggingProperty(Log.__props,_name,"SOURCE"); _source = source==null?__source:Boolean.parseBoolean(source); } catch (AccessControlException ace) @@ -227,7 +232,7 @@ public class StdErrLog extends AbstractLogger try { // allow stacktrace display to be controlled by properties as well - String stacks = getLoggingProperty(props,_name,"STACKS"); + String stacks = getLoggingProperty(Log.__props,_name,"STACKS"); _hideStacks = stacks==null?false:!Boolean.parseBoolean(stacks); } catch (AccessControlException ignore) @@ -236,136 +241,6 @@ public class StdErrLog extends AbstractLogger } } - /** - * Get the Logging Level for the provided log name. Using the FQCN first, then each package segment from longest to - * shortest. - * - * @param props - * the properties to check - * @param name - * the name to get log for - * @return the logging level - */ - public static int getLoggingLevel(Properties props, final String name) - { - if ((props == null) || (props.isEmpty())) - { - // Default Logging Level - return getLevelId("log.LEVEL","INFO"); - } - - // Calculate the level this named logger should operate under. - // Checking with FQCN first, then each package segment from longest to shortest. - String nameSegment = name; - - while ((nameSegment != null) && (nameSegment.length() > 0)) - { - String levelStr = props.getProperty(nameSegment + ".LEVEL"); - // System.err.printf("[StdErrLog.CONFIG] Checking for property [%s.LEVEL] = %s%n",nameSegment,levelStr); - int level = getLevelId(nameSegment + ".LEVEL",levelStr); - if (level != (-1)) - { - return level; - } - - // Trim and try again. - int idx = nameSegment.lastIndexOf('.'); - if (idx >= 0) - { - nameSegment = nameSegment.substring(0,idx); - } - else - { - nameSegment = null; - } - } - - // Default Logging Level - return getLevelId("log.LEVEL",props.getProperty("log.LEVEL","INFO")); - } - - public static String getLoggingProperty(Properties props, String name, String property) - { - // Calculate the level this named logger should operate under. - // Checking with FQCN first, then each package segment from longest to shortest. - String nameSegment = name; - - while ((nameSegment != null) && (nameSegment.length() > 0)) - { - String s = props.getProperty(nameSegment+"."+property); - if (s!=null) - return s; - - // Trim and try again. - int idx = nameSegment.lastIndexOf('.'); - nameSegment = (idx >= 0)?nameSegment.substring(0,idx):null; - } - - return null; - } - - protected static int getLevelId(String levelSegment, String levelName) - { - if (levelName == null) - { - return -1; - } - String levelStr = levelName.trim(); - if ("ALL".equalsIgnoreCase(levelStr)) - { - return LEVEL_ALL; - } - else if ("DEBUG".equalsIgnoreCase(levelStr)) - { - return LEVEL_DEBUG; - } - else if ("INFO".equalsIgnoreCase(levelStr)) - { - return LEVEL_INFO; - } - else if ("WARN".equalsIgnoreCase(levelStr)) - { - return LEVEL_WARN; - } - else if ("OFF".equalsIgnoreCase(levelStr)) - { - return LEVEL_OFF; - } - - System.err.println("Unknown StdErrLog level [" + levelSegment + "]=[" + levelStr + "], expecting only [ALL, DEBUG, INFO, WARN, OFF] as values."); - return -1; - } - - /** - * Condenses a classname by stripping down the package name to just the first character of each package name - * segment.Configured - * - * <pre> - * Examples: - * "org.eclipse.jetty.test.FooTest" = "oejt.FooTest" - * "org.eclipse.jetty.server.logging.LogTest" = "orjsl.LogTest" - * </pre> - * - * @param classname - * the fully qualified class name - * @return the condensed name - */ - protected static String condensePackageString(String classname) - { - String parts[] = classname.split("\\."); - StringBuilder dense = new StringBuilder(); - for (int i = 0; i < (parts.length - 1); i++) - { - dense.append(parts[i].charAt(0)); - } - if (dense.length() > 0) - { - dense.append('.'); - } - dense.append(parts[parts.length - 1]); - return dense.toString(); - } - public String getName() { return _name; @@ -798,12 +673,6 @@ public class StdErrLog extends AbstractLogger return s.toString(); } - public static void setProperties(Properties props) - { - __props.clear(); - __props.putAll(props); - } - public void ignore(Throwable ignored) { if (_level <= LEVEL_ALL) |