Additional fix for #310603: Log cleanup.

git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@1592 7e9141cc-0065-0410-87d8-b60c137991c4
This commit is contained in:
Simone Bordet 2010-04-27 14:08:48 +00:00
parent 1eba7b979a
commit 4eaf03f08e
3 changed files with 92 additions and 130 deletions

View File

@ -126,11 +126,8 @@ public class JavaUtilLog implements Logger
if (bracesIndex < 0) if (bracesIndex < 0)
{ {
builder.append(msg.substring(start)); builder.append(msg.substring(start));
if (arg != null) builder.append(" ");
{ builder.append(arg);
builder.append(" ");
builder.append(arg);
}
start = msg.length(); start = msg.length();
} }
else else

View File

@ -4,25 +4,24 @@
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution. // and Apache License v2.0 which accompanies this distribution.
// The Eclipse Public License is available at // The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html // http://www.eclipse.org/legal/epl-v10.html
// The Apache License v2.0 is available at // The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php // http://www.opensource.org/licenses/apache2.0.php
// You may elect to redistribute this code under either of these licenses. // You may elect to redistribute this code under either of these licenses.
// ======================================================================== // ========================================================================
package org.eclipse.jetty.util.log; package org.eclipse.jetty.util.log;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import org.eclipse.jetty.util.Loader; import org.eclipse.jetty.util.Loader;
/**
* Logging.
/*-----------------------------------------------------------------------*/ * This class provides a static logging interface. If an instance of the
/** Logging.
* This class provides a static logging interface. If an instance of the
* org.slf4j.Logger class is found on the classpath, the static log methods * org.slf4j.Logger class is found on the classpath, the static log methods
* are directed to a slf4j logger for "org.eclipse.log". Otherwise the logs * are directed to a slf4j logger for "org.eclipse.log". Otherwise the logs
* are directed to stderr. * are directed to stderr.
@ -30,62 +29,55 @@ import org.eclipse.jetty.util.Loader;
* The "org.eclipse.jetty.util.log.class" system property can be used * The "org.eclipse.jetty.util.log.class" system property can be used
* to select a specific logging implementation. * to select a specific logging implementation.
* <p> * <p>
* If the system property org.eclipse.jetty.util.log.IGNORED is set, * If the system property org.eclipse.jetty.util.log.IGNORED is set,
* then ignored exceptions are logged in detail. * then ignored exceptions are logged in detail.
* *
* @see StdErrLog * @see StdErrLog
* @see Slf4jLog * @see Slf4jLog
*/ */
public class Log public class Log
{ {
private static final String[] __nestedEx =
{"getTargetException","getTargetError","getException","getRootCause"};
/*-------------------------------------------------------------------*/
private static final Class[] __noArgs=new Class[0];
public final static String EXCEPTION= "EXCEPTION "; public final static String EXCEPTION= "EXCEPTION ";
public final static String IGNORED= "IGNORED"; public final static String IGNORED= "IGNORED";
public final static String IGNORED_FMT= "IGNORED: {}";
public final static String NOT_IMPLEMENTED= "NOT IMPLEMENTED ";
public static String __logClass; public static String __logClass;
public static boolean __ignored; public static boolean __ignored;
static static
{ {
AccessController.doPrivileged(new PrivilegedAction<Boolean>() AccessController.doPrivileged(new PrivilegedAction<Object>()
{
public Object run()
{ {
public Boolean run() __logClass = System.getProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.Slf4jLog");
{ __ignored = Boolean.parseBoolean(System.getProperty("org.eclipse.jetty.util.log.IGNORED", "false"));
__logClass = System.getProperty("org.eclipse.jetty.util.log.class","org.eclipse.jetty.util.log.Slf4jLog"); return null;
__ignored = Boolean.parseBoolean(System.getProperty("org.eclipse.jetty.util.log.IGNORED","false")); }
return true; });
}
});
} }
private static Logger __log; private static Logger __log;
private static boolean _initialized; private static boolean __initialized;
public static boolean initialized() public static boolean initialized()
{ {
if (__log!=null) if (__log != null)
return true; return true;
synchronized (Log.class) synchronized (Log.class)
{ {
if (_initialized) if (__initialized)
return __log!=null; return __log != null;
_initialized=true; __initialized = true;
} }
Class log_class=null;
try try
{ {
log_class=Loader.loadClass(Log.class, __logClass); Class log_class = Loader.loadClass(Log.class, __logClass);
if (__log==null || !__log.getClass().equals(log_class)) if (__log == null || !__log.getClass().equals(log_class))
{ {
__log=(Logger) log_class.newInstance(); __log = (Logger)log_class.newInstance();
__log.info("Logging to {} via {}",__log,log_class.getName()); __log.info("Logging to {} via {}", __log, log_class.getName());
} }
} }
catch(NoClassDefFoundError e) catch(NoClassDefFoundError e)
@ -97,34 +89,34 @@ public class Log
initStandardLogging(e); initStandardLogging(e);
} }
return __log!=null; return __log != null;
} }
private static void initStandardLogging(Throwable e) private static void initStandardLogging(Throwable e)
{ {
Class log_class; Class log_class;
if(e != null && __ignored) if(e != null && __ignored)
e.printStackTrace(); e.printStackTrace();
if (__log==null) if (__log == null)
{ {
log_class= StdErrLog.class; log_class = StdErrLog.class;
__log=new StdErrLog(); __log = new StdErrLog();
__log.info("Logging to {} via {}",__log,log_class.getName()); __log.info("Logging to {} via {}", __log, log_class.getName());
} }
} }
public static void setLog(Logger log) public static void setLog(Logger log)
{ {
Log.__log=log; Log.__log = log;
} }
public static Logger getLog() public static Logger getLog()
{ {
initialized(); initialized();
return __log; return __log;
} }
/** /**
* Set Log to parent Logger. * Set Log to parent Logger.
* <p> * <p>
@ -132,12 +124,12 @@ public class Log
* call {@link #getLogger(String)} on it and construct a {@link LoggerLog} instance * call {@link #getLogger(String)} on it and construct a {@link LoggerLog} instance
* as this Log's Logger, so that logging is delegated to the parent Log. * as this Log's Logger, so that logging is delegated to the parent Log.
* <p> * <p>
* This should be used if a webapp is using Log, but wishes the logging to be * This should be used if a webapp is using Log, but wishes the logging to be
* directed to the containers log. * directed to the containers log.
* <p> * <p>
* If there is not parent Log, then this call is equivalent to<pre> * If there is not parent Log, then this call is equivalent to<pre>
* Log.setLog(Log.getLogger(name)); * Log.setLog(Log.getLogger(name));
* </pre> * </pre>
* @param name Logger name * @param name Logger name
*/ */
public static void setLogToParent(String name) public static void setLogToParent(String name)
@ -148,161 +140,137 @@ public class Log
try try
{ {
Class<?> uberlog = loader.getParent().loadClass("org.eclipse.jetty.util.log.Log"); Class<?> uberlog = loader.getParent().loadClass("org.eclipse.jetty.util.log.Log");
Method getLogger=uberlog.getMethod("getLogger",new Class[]{String.class}); Method getLogger = uberlog.getMethod("getLogger", new Class[]{String.class});
Object logger = getLogger.invoke(null,name); Object logger = getLogger.invoke(null,name);
setLog(new LoggerLog(logger)); setLog(new LoggerLog(logger));
return;
} }
catch (Exception e) catch (Exception e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
}
else
{
setLog(getLogger(name));
} }
setLog(getLogger(name));
} }
public static void debug(Throwable th) public static void debug(Throwable th)
{ {
if (!isDebugEnabled()) if (!isDebugEnabled())
return; return;
__log.debug(EXCEPTION,th); __log.debug(EXCEPTION, th);
unwind(th);
} }
public static void debug(String msg) public static void debug(String msg)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.debug(msg);
__log.debug(msg,null,null);
} }
public static void debug(String msg,Object arg) public static void debug(String msg, Object arg)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.debug(msg,arg,null); __log.debug(msg, arg);
} }
public static void debug(String msg,Object arg0, Object arg1) public static void debug(String msg, Object arg0, Object arg1)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.debug(msg,arg0,arg1); __log.debug(msg, arg0, arg1);
} }
/* ------------------------------------------------------------ */
/** /**
* Ignore an exception unless trace is enabled. * Ignore an exception unless trace is enabled.
* This works around the problem that log4j does not support the trace level. * This works around the problem that log4j does not support the trace level.
* @param thrown the Throwable to ignore
*/ */
public static void ignore(Throwable th) public static void ignore(Throwable thrown)
{ {
if (!initialized()) if (!initialized())
return; return;
if (__ignored) if (__ignored)
{ {
__log.warn(IGNORED,th); __log.warn(IGNORED, thrown);
unwind(th);
} }
} }
public static void info(String msg) public static void info(String msg)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.info(msg,null,null); __log.info(msg);
} }
public static void info(String msg,Object arg) public static void info(String msg, Object arg)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.info(msg,arg,null); __log.info(msg, arg);
} }
public static void info(String msg,Object arg0, Object arg1) public static void info(String msg, Object arg0, Object arg1)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.info(msg,arg0,arg1); __log.info(msg, arg0, arg1);
} }
public static boolean isDebugEnabled() public static boolean isDebugEnabled()
{ {
if (!initialized()) if (!initialized())
return false; return false;
return __log.isDebugEnabled(); return __log.isDebugEnabled();
} }
public static void warn(String msg) public static void warn(String msg)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.warn(msg,null,null); __log.warn(msg);
} }
public static void warn(String msg,Object arg) public static void warn(String msg, Object arg)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.warn(msg,arg,null); __log.warn(msg, arg);
} }
public static void warn(String msg,Object arg0, Object arg1) public static void warn(String msg, Object arg0, Object arg1)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.warn(msg,arg0,arg1); __log.warn(msg, arg0, arg1);
} }
public static void warn(String msg, Throwable th) public static void warn(String msg, Throwable th)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.warn(msg,th); __log.warn(msg, th);
unwind(th);
} }
public static void warn(Throwable th) public static void warn(Throwable th)
{ {
if (!initialized()) if (!initialized())
return; return;
__log.warn(EXCEPTION,th); __log.warn(EXCEPTION, th);
unwind(th);
} }
/** Obtain a named Logger. /**
* Obtain a named Logger or the default Logger if null is passed. * Obtain a named Logger or the default Logger if null is passed.
* @param name the Logger name
* @return the Logger with the given name
*/ */
public static Logger getLogger(String name) public static Logger getLogger(String name)
{ {
if (!initialized()) if (!initialized())
return null; return null;
if (name==null)
return __log;
return __log.getLogger(name);
}
private static void unwind(Throwable th) return name == null ? __log : __log.getLogger(name);
{
if (th==null)
return;
for (int i=0;i<__nestedEx.length;i++)
{
try
{
Method get_target = th.getClass().getMethod(__nestedEx[i],__noArgs);
Throwable th2=(Throwable)get_target.invoke(th,(Object[])null);
if (th2!=null && th2!=th)
warn("Nested in "+th+":",th2);
}
catch(Exception ignore){}
}
} }
} }

View File

@ -197,11 +197,8 @@ public class StdErrLog implements Logger
if (bracesIndex < 0) if (bracesIndex < 0)
{ {
escape(builder, msg.substring(start)); escape(builder, msg.substring(start));
if (arg != null) builder.append(" ");
{ builder.append(arg);
builder.append(" ");
builder.append(arg);
}
start = msg.length(); start = msg.length();
} }
else else