103928aee4356845252ac6b662d5c72c29903813eJake Slack//
203928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
303928aee4356845252ac6b662d5c72c29903813eJake Slack//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
403928aee4356845252ac6b662d5c72c29903813eJake Slack//  ------------------------------------------------------------------------
503928aee4356845252ac6b662d5c72c29903813eJake Slack//  All rights reserved. This program and the accompanying materials
603928aee4356845252ac6b662d5c72c29903813eJake Slack//  are made available under the terms of the Eclipse Public License v1.0
703928aee4356845252ac6b662d5c72c29903813eJake Slack//  and Apache License v2.0 which accompanies this distribution.
803928aee4356845252ac6b662d5c72c29903813eJake Slack//
903928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Eclipse Public License is available at
1003928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.eclipse.org/legal/epl-v10.html
1103928aee4356845252ac6b662d5c72c29903813eJake Slack//
1203928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Apache License v2.0 is available at
1303928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.opensource.org/licenses/apache2.0.php
1403928aee4356845252ac6b662d5c72c29903813eJake Slack//
1503928aee4356845252ac6b662d5c72c29903813eJake Slack//  You may elect to redistribute this code under either of these licenses.
1603928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
1703928aee4356845252ac6b662d5c72c29903813eJake Slack//
1803928aee4356845252ac6b662d5c72c29903813eJake Slack
1903928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.util.log;
2003928aee4356845252ac6b662d5c72c29903813eJake Slack
2103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.IOException;
2203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.InputStream;
2303928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.lang.reflect.Method;
2403928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.net.URL;
2503928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.security.AccessController;
2603928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.security.PrivilegedAction;
2703928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Collection;
2803928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Collections;
2903928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Enumeration;
3003928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.HashMap;
3103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Map;
3203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Properties;
3303928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.concurrent.ConcurrentHashMap;
3403928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.concurrent.ConcurrentMap;
3503928aee4356845252ac6b662d5c72c29903813eJake Slack
3603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.IO;
3703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.Loader;
3803928aee4356845252ac6b662d5c72c29903813eJake Slack
3903928aee4356845252ac6b662d5c72c29903813eJake Slack/**
4003928aee4356845252ac6b662d5c72c29903813eJake Slack * Logging.
4103928aee4356845252ac6b662d5c72c29903813eJake Slack * This class provides a static logging interface.  If an instance of the
4203928aee4356845252ac6b662d5c72c29903813eJake Slack * org.slf4j.Logger class is found on the classpath, the static log methods
4303928aee4356845252ac6b662d5c72c29903813eJake Slack * are directed to a slf4j logger for "org.eclipse.log".   Otherwise the logs
4403928aee4356845252ac6b662d5c72c29903813eJake Slack * are directed to stderr.
4503928aee4356845252ac6b662d5c72c29903813eJake Slack * <p>
4603928aee4356845252ac6b662d5c72c29903813eJake Slack * The "org.eclipse.jetty.util.log.class" system property can be used
4703928aee4356845252ac6b662d5c72c29903813eJake Slack * to select a specific logging implementation.
4803928aee4356845252ac6b662d5c72c29903813eJake Slack * <p>
4903928aee4356845252ac6b662d5c72c29903813eJake Slack * If the system property org.eclipse.jetty.util.log.IGNORED is set,
5003928aee4356845252ac6b662d5c72c29903813eJake Slack * then ignored exceptions are logged in detail.
5103928aee4356845252ac6b662d5c72c29903813eJake Slack *
5203928aee4356845252ac6b662d5c72c29903813eJake Slack * @see StdErrLog
5303928aee4356845252ac6b662d5c72c29903813eJake Slack * @see Slf4jLog
5403928aee4356845252ac6b662d5c72c29903813eJake Slack */
5503928aee4356845252ac6b662d5c72c29903813eJake Slackpublic class Log
5603928aee4356845252ac6b662d5c72c29903813eJake Slack{
5703928aee4356845252ac6b662d5c72c29903813eJake Slack    public final static String EXCEPTION= "EXCEPTION ";
5803928aee4356845252ac6b662d5c72c29903813eJake Slack    public final static String IGNORED= "IGNORED ";
5903928aee4356845252ac6b662d5c72c29903813eJake Slack
6003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
6103928aee4356845252ac6b662d5c72c29903813eJake Slack     * Logging Configuration Properties
6203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
6303928aee4356845252ac6b662d5c72c29903813eJake Slack    protected static Properties __props;
6403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
6503928aee4356845252ac6b662d5c72c29903813eJake Slack     * The {@link Logger} implementation class name
6603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
6703928aee4356845252ac6b662d5c72c29903813eJake Slack    public static String __logClass;
6803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
6903928aee4356845252ac6b662d5c72c29903813eJake Slack     * Legacy flag indicating if {@link Log#ignore(Throwable)} methods produce any output in the {@link Logger}s
7003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
7103928aee4356845252ac6b662d5c72c29903813eJake Slack    public static boolean __ignored;
7203928aee4356845252ac6b662d5c72c29903813eJake Slack
7303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
7403928aee4356845252ac6b662d5c72c29903813eJake Slack     * Hold loggers only.
7503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
7603928aee4356845252ac6b662d5c72c29903813eJake Slack    private final static ConcurrentMap<String, Logger> __loggers = new ConcurrentHashMap<String, Logger>();
7703928aee4356845252ac6b662d5c72c29903813eJake Slack
7803928aee4356845252ac6b662d5c72c29903813eJake Slack
7903928aee4356845252ac6b662d5c72c29903813eJake Slack    static
8003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
8103928aee4356845252ac6b662d5c72c29903813eJake Slack        /* Instantiate a default configuration properties (empty)
8203928aee4356845252ac6b662d5c72c29903813eJake Slack         */
8303928aee4356845252ac6b662d5c72c29903813eJake Slack        __props = new Properties();
8403928aee4356845252ac6b662d5c72c29903813eJake Slack
8503928aee4356845252ac6b662d5c72c29903813eJake Slack        AccessController.doPrivileged(new PrivilegedAction<Object>()
8603928aee4356845252ac6b662d5c72c29903813eJake Slack        {
8703928aee4356845252ac6b662d5c72c29903813eJake Slack            public Object run()
8803928aee4356845252ac6b662d5c72c29903813eJake Slack            {
8903928aee4356845252ac6b662d5c72c29903813eJake Slack                /* First see if the jetty-logging.properties object exists in the classpath.
9003928aee4356845252ac6b662d5c72c29903813eJake Slack                 * This is an optional feature used by embedded mode use, and test cases to allow for early
9103928aee4356845252ac6b662d5c72c29903813eJake Slack                 * configuration of the Log class in situations where access to the System.properties are
9203928aee4356845252ac6b662d5c72c29903813eJake Slack                 * either too late or just impossible.
9303928aee4356845252ac6b662d5c72c29903813eJake Slack                 */
9403928aee4356845252ac6b662d5c72c29903813eJake Slack                URL testProps = Loader.getResource(Log.class,"jetty-logging.properties",true);
9503928aee4356845252ac6b662d5c72c29903813eJake Slack                if (testProps != null)
9603928aee4356845252ac6b662d5c72c29903813eJake Slack                {
9703928aee4356845252ac6b662d5c72c29903813eJake Slack                    InputStream in = null;
9803928aee4356845252ac6b662d5c72c29903813eJake Slack                    try
9903928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
10003928aee4356845252ac6b662d5c72c29903813eJake Slack                        in = testProps.openStream();
10103928aee4356845252ac6b662d5c72c29903813eJake Slack                        __props.load(in);
10203928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
10303928aee4356845252ac6b662d5c72c29903813eJake Slack                    catch (IOException e)
10403928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
10503928aee4356845252ac6b662d5c72c29903813eJake Slack                        System.err.println("Unable to load " + testProps);
10603928aee4356845252ac6b662d5c72c29903813eJake Slack                        e.printStackTrace(System.err);
10703928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
10803928aee4356845252ac6b662d5c72c29903813eJake Slack                    finally
10903928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
11003928aee4356845252ac6b662d5c72c29903813eJake Slack                        IO.close(in);
11103928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
11203928aee4356845252ac6b662d5c72c29903813eJake Slack                }
11303928aee4356845252ac6b662d5c72c29903813eJake Slack
11403928aee4356845252ac6b662d5c72c29903813eJake Slack                /* Now load the System.properties as-is into the __props, these values will override
11503928aee4356845252ac6b662d5c72c29903813eJake Slack                 * any key conflicts in __props.
11603928aee4356845252ac6b662d5c72c29903813eJake Slack                 */
11703928aee4356845252ac6b662d5c72c29903813eJake Slack                @SuppressWarnings("unchecked")
11803928aee4356845252ac6b662d5c72c29903813eJake Slack                Enumeration<String> systemKeyEnum = (Enumeration<String>)System.getProperties().propertyNames();
11903928aee4356845252ac6b662d5c72c29903813eJake Slack                while (systemKeyEnum.hasMoreElements())
12003928aee4356845252ac6b662d5c72c29903813eJake Slack                {
12103928aee4356845252ac6b662d5c72c29903813eJake Slack                    String key = systemKeyEnum.nextElement();
12203928aee4356845252ac6b662d5c72c29903813eJake Slack                    String val = System.getProperty(key);
12303928aee4356845252ac6b662d5c72c29903813eJake Slack                    //protect against application code insertion of non-String values (returned as null)
12403928aee4356845252ac6b662d5c72c29903813eJake Slack                    if (val != null)
12503928aee4356845252ac6b662d5c72c29903813eJake Slack                        __props.setProperty(key,val);
12603928aee4356845252ac6b662d5c72c29903813eJake Slack                }
12703928aee4356845252ac6b662d5c72c29903813eJake Slack
12803928aee4356845252ac6b662d5c72c29903813eJake Slack                /* Now use the configuration properties to configure the Log statics
12903928aee4356845252ac6b662d5c72c29903813eJake Slack                 */
13003928aee4356845252ac6b662d5c72c29903813eJake Slack                __logClass = __props.getProperty("org.eclipse.jetty.util.log.class","org.eclipse.jetty.util.log.Slf4jLog");
13103928aee4356845252ac6b662d5c72c29903813eJake Slack                __ignored = Boolean.parseBoolean(__props.getProperty("org.eclipse.jetty.util.log.IGNORED","false"));
13203928aee4356845252ac6b662d5c72c29903813eJake Slack                return null;
13303928aee4356845252ac6b662d5c72c29903813eJake Slack            }
13403928aee4356845252ac6b662d5c72c29903813eJake Slack        });
13503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
13603928aee4356845252ac6b662d5c72c29903813eJake Slack
13703928aee4356845252ac6b662d5c72c29903813eJake Slack    private static Logger LOG;
13803928aee4356845252ac6b662d5c72c29903813eJake Slack    private static boolean __initialized;
13903928aee4356845252ac6b662d5c72c29903813eJake Slack
14003928aee4356845252ac6b662d5c72c29903813eJake Slack    public static boolean initialized()
14103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
14203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (LOG != null)
14303928aee4356845252ac6b662d5c72c29903813eJake Slack        {
14403928aee4356845252ac6b662d5c72c29903813eJake Slack            return true;
14503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
14603928aee4356845252ac6b662d5c72c29903813eJake Slack
14703928aee4356845252ac6b662d5c72c29903813eJake Slack        synchronized (Log.class)
14803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
14903928aee4356845252ac6b662d5c72c29903813eJake Slack            if (__initialized)
15003928aee4356845252ac6b662d5c72c29903813eJake Slack            {
15103928aee4356845252ac6b662d5c72c29903813eJake Slack                return LOG != null;
15203928aee4356845252ac6b662d5c72c29903813eJake Slack            }
15303928aee4356845252ac6b662d5c72c29903813eJake Slack            __initialized = true;
15403928aee4356845252ac6b662d5c72c29903813eJake Slack        }
15503928aee4356845252ac6b662d5c72c29903813eJake Slack
15603928aee4356845252ac6b662d5c72c29903813eJake Slack        try
15703928aee4356845252ac6b662d5c72c29903813eJake Slack        {
15803928aee4356845252ac6b662d5c72c29903813eJake Slack            Class<?> log_class = Loader.loadClass(Log.class, __logClass);
15903928aee4356845252ac6b662d5c72c29903813eJake Slack            if (LOG == null || !LOG.getClass().equals(log_class))
16003928aee4356845252ac6b662d5c72c29903813eJake Slack            {
16103928aee4356845252ac6b662d5c72c29903813eJake Slack                LOG = (Logger)log_class.newInstance();
16203928aee4356845252ac6b662d5c72c29903813eJake Slack                LOG.debug("Logging to {} via {}", LOG, log_class.getName());
16303928aee4356845252ac6b662d5c72c29903813eJake Slack            }
16403928aee4356845252ac6b662d5c72c29903813eJake Slack        }
16503928aee4356845252ac6b662d5c72c29903813eJake Slack        catch(Throwable e)
16603928aee4356845252ac6b662d5c72c29903813eJake Slack        {
16703928aee4356845252ac6b662d5c72c29903813eJake Slack            // Unable to load specified Logger implementation, default to standard logging.
16803928aee4356845252ac6b662d5c72c29903813eJake Slack            initStandardLogging(e);
16903928aee4356845252ac6b662d5c72c29903813eJake Slack        }
17003928aee4356845252ac6b662d5c72c29903813eJake Slack
17103928aee4356845252ac6b662d5c72c29903813eJake Slack        return LOG != null;
17203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
17303928aee4356845252ac6b662d5c72c29903813eJake Slack
17403928aee4356845252ac6b662d5c72c29903813eJake Slack    private static void initStandardLogging(Throwable e)
17503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
17603928aee4356845252ac6b662d5c72c29903813eJake Slack        Class<?> log_class;
17703928aee4356845252ac6b662d5c72c29903813eJake Slack        if(e != null && __ignored)
17803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
17903928aee4356845252ac6b662d5c72c29903813eJake Slack            e.printStackTrace();
18003928aee4356845252ac6b662d5c72c29903813eJake Slack        }
18103928aee4356845252ac6b662d5c72c29903813eJake Slack
18203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (LOG == null)
18303928aee4356845252ac6b662d5c72c29903813eJake Slack        {
18403928aee4356845252ac6b662d5c72c29903813eJake Slack            log_class = StdErrLog.class;
18503928aee4356845252ac6b662d5c72c29903813eJake Slack            LOG = new StdErrLog();
18603928aee4356845252ac6b662d5c72c29903813eJake Slack            LOG.debug("Logging to {} via {}", LOG, log_class.getName());
18703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
18803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
18903928aee4356845252ac6b662d5c72c29903813eJake Slack
19003928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void setLog(Logger log)
19103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
19203928aee4356845252ac6b662d5c72c29903813eJake Slack        Log.LOG = log;
19303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
19403928aee4356845252ac6b662d5c72c29903813eJake Slack
19503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
19603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
19703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
19803928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
19903928aee4356845252ac6b662d5c72c29903813eJake Slack    public static Logger getLog()
20003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
20103928aee4356845252ac6b662d5c72c29903813eJake Slack        initialized();
20203928aee4356845252ac6b662d5c72c29903813eJake Slack        return LOG;
20303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
20403928aee4356845252ac6b662d5c72c29903813eJake Slack
20503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
20603928aee4356845252ac6b662d5c72c29903813eJake Slack     * Get the root logger.
20703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the root logger
20803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
20903928aee4356845252ac6b662d5c72c29903813eJake Slack    public static Logger getRootLogger() {
21003928aee4356845252ac6b662d5c72c29903813eJake Slack        initialized();
21103928aee4356845252ac6b662d5c72c29903813eJake Slack        return LOG;
21203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
21303928aee4356845252ac6b662d5c72c29903813eJake Slack
21403928aee4356845252ac6b662d5c72c29903813eJake Slack    static boolean isIgnored()
21503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
21603928aee4356845252ac6b662d5c72c29903813eJake Slack        return __ignored;
21703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
21803928aee4356845252ac6b662d5c72c29903813eJake Slack
21903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
22003928aee4356845252ac6b662d5c72c29903813eJake Slack     * Set Log to parent Logger.
22103928aee4356845252ac6b662d5c72c29903813eJake Slack     * <p>
22203928aee4356845252ac6b662d5c72c29903813eJake Slack     * If there is a different Log class available from a parent classloader,
22303928aee4356845252ac6b662d5c72c29903813eJake Slack     * call {@link #getLogger(String)} on it and construct a {@link LoggerLog} instance
22403928aee4356845252ac6b662d5c72c29903813eJake Slack     * as this Log's Logger, so that logging is delegated to the parent Log.
22503928aee4356845252ac6b662d5c72c29903813eJake Slack     * <p>
22603928aee4356845252ac6b662d5c72c29903813eJake Slack     * This should be used if a webapp is using Log, but wishes the logging to be
22703928aee4356845252ac6b662d5c72c29903813eJake Slack     * directed to the containers log.
22803928aee4356845252ac6b662d5c72c29903813eJake Slack     * <p>
22903928aee4356845252ac6b662d5c72c29903813eJake Slack     * If there is not parent Log, then this call is equivalent to<pre>
23003928aee4356845252ac6b662d5c72c29903813eJake Slack     *   Log.setLog(Log.getLogger(name));
23103928aee4356845252ac6b662d5c72c29903813eJake Slack     * </pre>
23203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param name Logger name
23303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
23403928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void setLogToParent(String name)
23503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
23603928aee4356845252ac6b662d5c72c29903813eJake Slack        ClassLoader loader = Log.class.getClassLoader();
23703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (loader!=null && loader.getParent()!=null)
23803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
23903928aee4356845252ac6b662d5c72c29903813eJake Slack            try
24003928aee4356845252ac6b662d5c72c29903813eJake Slack            {
24103928aee4356845252ac6b662d5c72c29903813eJake Slack                Class<?> uberlog = loader.getParent().loadClass("org.eclipse.jetty.util.log.Log");
24203928aee4356845252ac6b662d5c72c29903813eJake Slack                Method getLogger = uberlog.getMethod("getLogger", new Class[]{String.class});
24303928aee4356845252ac6b662d5c72c29903813eJake Slack                Object logger = getLogger.invoke(null,name);
24403928aee4356845252ac6b662d5c72c29903813eJake Slack                setLog(new LoggerLog(logger));
24503928aee4356845252ac6b662d5c72c29903813eJake Slack            }
24603928aee4356845252ac6b662d5c72c29903813eJake Slack            catch (Exception e)
24703928aee4356845252ac6b662d5c72c29903813eJake Slack            {
24803928aee4356845252ac6b662d5c72c29903813eJake Slack                e.printStackTrace();
24903928aee4356845252ac6b662d5c72c29903813eJake Slack            }
25003928aee4356845252ac6b662d5c72c29903813eJake Slack        }
25103928aee4356845252ac6b662d5c72c29903813eJake Slack        else
25203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
25303928aee4356845252ac6b662d5c72c29903813eJake Slack            setLog(getLogger(name));
25403928aee4356845252ac6b662d5c72c29903813eJake Slack        }
25503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
25603928aee4356845252ac6b662d5c72c29903813eJake Slack
25703928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
25803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
25903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
26003928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
26103928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void debug(Throwable th)
26203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
26303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!isDebugEnabled())
26403928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
26503928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.debug(EXCEPTION, th);
26603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
26703928aee4356845252ac6b662d5c72c29903813eJake Slack
26803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
26903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
27003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
27103928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
27203928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void debug(String msg)
27303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
27403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
27503928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
27603928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.debug(msg);
27703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
27803928aee4356845252ac6b662d5c72c29903813eJake Slack
27903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
28003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
28103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
28203928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
28303928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void debug(String msg, Object arg)
28403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
28503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
28603928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
28703928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.debug(msg, arg);
28803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
28903928aee4356845252ac6b662d5c72c29903813eJake Slack
29003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
29103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
29203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
29303928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
29403928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void debug(String msg, Object arg0, Object arg1)
29503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
29603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
29703928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
29803928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.debug(msg, arg0, arg1);
29903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
30003928aee4356845252ac6b662d5c72c29903813eJake Slack
30103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
30203928aee4356845252ac6b662d5c72c29903813eJake Slack     * Ignore an exception unless trace is enabled.
30303928aee4356845252ac6b662d5c72c29903813eJake Slack     * This works around the problem that log4j does not support the trace level.
30403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param thrown the Throwable to ignore
30503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
30603928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
30703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
30803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
30903928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
31003928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void ignore(Throwable thrown)
31103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
31203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
31303928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
31403928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.ignore(thrown);
31503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
31603928aee4356845252ac6b662d5c72c29903813eJake Slack
31703928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
31803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
31903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
32003928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
32103928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void info(String msg)
32203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
32303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
32403928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
32503928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.info(msg);
32603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
32703928aee4356845252ac6b662d5c72c29903813eJake Slack
32803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
32903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
33003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
33103928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
33203928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void info(String msg, Object arg)
33303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
33403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
33503928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
33603928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.info(msg, arg);
33703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
33803928aee4356845252ac6b662d5c72c29903813eJake Slack
33903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
34003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
34103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
34203928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
34303928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void info(String msg, Object arg0, Object arg1)
34403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
34503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
34603928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
34703928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.info(msg, arg0, arg1);
34803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
34903928aee4356845252ac6b662d5c72c29903813eJake Slack
35003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
35103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
35203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
35303928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
35403928aee4356845252ac6b662d5c72c29903813eJake Slack    public static boolean isDebugEnabled()
35503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
35603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
35703928aee4356845252ac6b662d5c72c29903813eJake Slack            return false;
35803928aee4356845252ac6b662d5c72c29903813eJake Slack        return LOG.isDebugEnabled();
35903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
36003928aee4356845252ac6b662d5c72c29903813eJake Slack
36103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
36203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
36303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
36403928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
36503928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void warn(String msg)
36603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
36703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
36803928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
36903928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.warn(msg);
37003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
37103928aee4356845252ac6b662d5c72c29903813eJake Slack
37203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
37303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
37403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
37503928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
37603928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void warn(String msg, Object arg)
37703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
37803928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
37903928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
38003928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.warn(msg, arg);
38103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
38203928aee4356845252ac6b662d5c72c29903813eJake Slack
38303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
38403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
38503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
38603928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
38703928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void warn(String msg, Object arg0, Object arg1)
38803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
38903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
39003928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
39103928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.warn(msg, arg0, arg1);
39203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
39303928aee4356845252ac6b662d5c72c29903813eJake Slack
39403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
39503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
39603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
39703928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
39803928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void warn(String msg, Throwable th)
39903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
40003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
40103928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
40203928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.warn(msg, th);
40303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
40403928aee4356845252ac6b662d5c72c29903813eJake Slack
40503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
40603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated anonymous logging is deprecated, use a named {@link Logger} obtained from {@link #getLogger(String)}
40703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
40803928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
40903928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void warn(Throwable th)
41003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
41103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
41203928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
41303928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.warn(EXCEPTION, th);
41403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
41503928aee4356845252ac6b662d5c72c29903813eJake Slack
41603928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
41703928aee4356845252ac6b662d5c72c29903813eJake Slack     * Obtain a named Logger based on the fully qualified class name.
41803928aee4356845252ac6b662d5c72c29903813eJake Slack     *
41903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param clazz
42003928aee4356845252ac6b662d5c72c29903813eJake Slack     *            the class to base the Logger name off of
42103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the Logger with the given name
42203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
42303928aee4356845252ac6b662d5c72c29903813eJake Slack    public static Logger getLogger(Class<?> clazz)
42403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
42503928aee4356845252ac6b662d5c72c29903813eJake Slack        return getLogger(clazz.getName());
42603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
42703928aee4356845252ac6b662d5c72c29903813eJake Slack
42803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
42903928aee4356845252ac6b662d5c72c29903813eJake Slack     * Obtain a named Logger or the default Logger if null is passed.
43003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param name the Logger name
43103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the Logger with the given name
43203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
43303928aee4356845252ac6b662d5c72c29903813eJake Slack    public static Logger getLogger(String name)
43403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
43503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!initialized())
43603928aee4356845252ac6b662d5c72c29903813eJake Slack            return null;
43703928aee4356845252ac6b662d5c72c29903813eJake Slack
43803928aee4356845252ac6b662d5c72c29903813eJake Slack        if(name==null)
43903928aee4356845252ac6b662d5c72c29903813eJake Slack            return LOG;
44003928aee4356845252ac6b662d5c72c29903813eJake Slack
44103928aee4356845252ac6b662d5c72c29903813eJake Slack        Logger logger = __loggers.get(name);
44203928aee4356845252ac6b662d5c72c29903813eJake Slack        if(logger==null)
44303928aee4356845252ac6b662d5c72c29903813eJake Slack            logger = LOG.getLogger(name);
44403928aee4356845252ac6b662d5c72c29903813eJake Slack
44503928aee4356845252ac6b662d5c72c29903813eJake Slack        return logger;
44603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
44703928aee4356845252ac6b662d5c72c29903813eJake Slack
44803928aee4356845252ac6b662d5c72c29903813eJake Slack    static ConcurrentMap<String, Logger> getMutableLoggers()
44903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
45003928aee4356845252ac6b662d5c72c29903813eJake Slack        return __loggers;
45103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
45203928aee4356845252ac6b662d5c72c29903813eJake Slack
45303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
45403928aee4356845252ac6b662d5c72c29903813eJake Slack     * Get a map of all configured {@link Logger} instances.
45503928aee4356845252ac6b662d5c72c29903813eJake Slack     *
45603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return a map of all configured {@link Logger} instances
45703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
45803928aee4356845252ac6b662d5c72c29903813eJake Slack    public static Map<String, Logger> getLoggers()
45903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
46003928aee4356845252ac6b662d5c72c29903813eJake Slack        return Collections.unmodifiableMap(__loggers);
46103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
46203928aee4356845252ac6b662d5c72c29903813eJake Slack}
463