|
|
|
@ -17,9 +17,7 @@
|
|
|
|
|
|
|
|
|
|
package com.fr.third.apache.log4j; |
|
|
|
|
|
|
|
|
|
import com.fr.third.apache.log4j.helpers.Loader; |
|
|
|
|
import com.fr.third.apache.log4j.helpers.LogLog; |
|
|
|
|
import com.fr.third.apache.log4j.helpers.OptionConverter; |
|
|
|
|
import com.fr.third.apache.log4j.spi.DefaultRepositorySelector; |
|
|
|
|
import com.fr.third.apache.log4j.spi.LoggerFactory; |
|
|
|
|
import com.fr.third.apache.log4j.spi.LoggerRepository; |
|
|
|
@ -27,13 +25,9 @@ import com.fr.third.apache.log4j.spi.NOPLoggerRepository;
|
|
|
|
|
import com.fr.third.apache.log4j.spi.RepositorySelector; |
|
|
|
|
import com.fr.third.apache.log4j.spi.RootLogger; |
|
|
|
|
|
|
|
|
|
import java.net.URL; |
|
|
|
|
import java.net.MalformedURLException; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.Enumeration; |
|
|
|
|
import java.io.StringWriter; |
|
|
|
|
import java.io.PrintWriter; |
|
|
|
|
import java.io.StringWriter; |
|
|
|
|
import java.util.Enumeration; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Use the <code>LogManager</code> class to retreive {@link Logger} |
|
|
|
@ -46,132 +40,79 @@ import java.io.PrintWriter;
|
|
|
|
|
* @author Ceki Gülcü */ |
|
|
|
|
public class LogManager { |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @deprecated This variable is for internal use only. It will |
|
|
|
|
* become package protected in future versions. |
|
|
|
|
* */ |
|
|
|
|
static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties"; |
|
|
|
|
|
|
|
|
|
static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml"; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @deprecated This variable is for internal use only. It will |
|
|
|
|
* become private in future versions. |
|
|
|
|
* */ |
|
|
|
|
static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration"; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @deprecated This variable is for internal use only. It will |
|
|
|
|
* become private in future versions. |
|
|
|
|
* */ |
|
|
|
|
static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass"; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @deprecated This variable is for internal use only. It will |
|
|
|
|
* become private in future versions. |
|
|
|
|
*/ |
|
|
|
|
public static final String DEFAULT_INIT_OVERRIDE_KEY = |
|
|
|
|
"log4j.defaultInitOverride"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static private Object guard = null; |
|
|
|
|
static private RepositorySelector repositorySelector; |
|
|
|
|
|
|
|
|
|
static { |
|
|
|
|
// By default we use a DefaultRepositorySelector which always returns 'h'.
|
|
|
|
|
Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG)); |
|
|
|
|
repositorySelector = new DefaultRepositorySelector(h); |
|
|
|
|
|
|
|
|
|
/** Search for the properties file log4j.properties in the CLASSPATH. */ |
|
|
|
|
String override = OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY, |
|
|
|
|
null); |
|
|
|
|
|
|
|
|
|
// if there is no default init override, then get the resource
|
|
|
|
|
// specified by the user or the default config file.
|
|
|
|
|
if(override == null || "false".equalsIgnoreCase(override)) { |
|
|
|
|
|
|
|
|
|
String configurationOptionStr = OptionConverter.getSystemProperty( |
|
|
|
|
DEFAULT_CONFIGURATION_KEY, |
|
|
|
|
null); |
|
|
|
|
|
|
|
|
|
String configuratorClassName = OptionConverter.getSystemProperty( |
|
|
|
|
CONFIGURATOR_CLASS_KEY, |
|
|
|
|
null); |
|
|
|
|
|
|
|
|
|
URL url = null; |
|
|
|
|
|
|
|
|
|
// if the user has not specified the log4j.configuration
|
|
|
|
|
// property, we search first for the file "log4j.xml" and then
|
|
|
|
|
// "log4j.properties"
|
|
|
|
|
if(configurationOptionStr == null) { |
|
|
|
|
url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE); |
|
|
|
|
if(url == null) { |
|
|
|
|
url = Loader.getResource(DEFAULT_CONFIGURATION_FILE); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
try { |
|
|
|
|
url = new URL(configurationOptionStr); |
|
|
|
|
} catch (MalformedURLException ex) { |
|
|
|
|
// so, resource is not a URL:
|
|
|
|
|
// attempt to get the resource from the class path
|
|
|
|
|
url = Loader.getResource(configurationOptionStr); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If we have a non-null url, then delegate the rest of the
|
|
|
|
|
// configuration to the OptionConverter.selectAndConfigure
|
|
|
|
|
// method.
|
|
|
|
|
if(url != null) { |
|
|
|
|
LogLog.debug("Using URL ["+url+"] for automatic log4j configuration."); |
|
|
|
|
try { |
|
|
|
|
OptionConverter.selectAndConfigure(url, configuratorClassName, |
|
|
|
|
LogManager.getLoggerRepository()); |
|
|
|
|
} catch (NoClassDefFoundError e) { |
|
|
|
|
LogLog.warn("Error during default initialization", e); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
LogLog.debug("Could not find resource: ["+configurationOptionStr+"]."); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
LogLog.debug("Default initialization of overridden by " + |
|
|
|
|
DEFAULT_INIT_OVERRIDE_KEY + "property."); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
/** |
|
|
|
|
* @deprecated This variable is for internal use only. It will |
|
|
|
|
* become package protected in future versions. |
|
|
|
|
* */ |
|
|
|
|
static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties"; |
|
|
|
|
|
|
|
|
|
static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml"; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @deprecated This variable is for internal use only. It will |
|
|
|
|
* become private in future versions. |
|
|
|
|
* */ |
|
|
|
|
static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration"; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @deprecated This variable is for internal use only. It will |
|
|
|
|
* become private in future versions. |
|
|
|
|
* */ |
|
|
|
|
static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass"; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @deprecated This variable is for internal use only. It will |
|
|
|
|
* become private in future versions. |
|
|
|
|
*/ |
|
|
|
|
public static final String DEFAULT_INIT_OVERRIDE_KEY = |
|
|
|
|
"log4j.defaultInitOverride"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static private Object guard = null; |
|
|
|
|
static private RepositorySelector repositorySelector; |
|
|
|
|
|
|
|
|
|
static { |
|
|
|
|
// By default we use a DefaultRepositorySelector which always returns 'h'.
|
|
|
|
|
Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG)); |
|
|
|
|
repositorySelector = new DefaultRepositorySelector(h); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
Sets <code>LoggerFactory</code> but only if the correct |
|
|
|
|
<em>guard</em> is passed as parameter. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Initally the guard is null. If the guard is |
|
|
|
|
<code>null</code>, then invoking this method sets the logger |
|
|
|
|
factory and the guard. Following invocations will throw a {@link |
|
|
|
|
IllegalArgumentException}, unless the previously set |
|
|
|
|
IllegalArgumentException}, unless the previously set |
|
|
|
|
<code>guard</code> is passed as the second parameter. |
|
|
|
|
|
|
|
|
|
<p>This allows a high-level component to set the {@link |
|
|
|
|
RepositorySelector} used by the <code>LogManager</code>. |
|
|
|
|
|
|
|
|
|
RepositorySelector} used by the <code>LogManager</code>. |
|
|
|
|
|
|
|
|
|
<p>For example, when tomcat starts it will be able to install its |
|
|
|
|
own repository selector. However, if and when Tomcat is embedded |
|
|
|
|
within JBoss, then JBoss will install its own repository selector |
|
|
|
|
and Tomcat will use the repository selector set by its container, |
|
|
|
|
JBoss. */ |
|
|
|
|
static |
|
|
|
|
public |
|
|
|
|
void setRepositorySelector(RepositorySelector selector, Object guard) |
|
|
|
|
throws IllegalArgumentException { |
|
|
|
|
if((LogManager.guard != null) && (LogManager.guard != guard)) { |
|
|
|
|
throw new IllegalArgumentException( |
|
|
|
|
"Attempted to reset the LoggerFactory without possessing the guard."); |
|
|
|
|
} |
|
|
|
|
static |
|
|
|
|
public |
|
|
|
|
void setRepositorySelector(RepositorySelector selector, Object guard) |
|
|
|
|
throws IllegalArgumentException { |
|
|
|
|
if((LogManager.guard != null) && (LogManager.guard != guard)) { |
|
|
|
|
throw new IllegalArgumentException( |
|
|
|
|
"Attempted to reset the LoggerFactory without possessing the guard."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(selector == null) { |
|
|
|
|
throw new IllegalArgumentException("RepositorySelector must be non-null."); |
|
|
|
|
} |
|
|
|
|
if(selector == null) { |
|
|
|
|
throw new IllegalArgumentException("RepositorySelector must be non-null."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
LogManager.guard = guard; |
|
|
|
|
LogManager.repositorySelector = selector; |
|
|
|
|
} |
|
|
|
|
LogManager.guard = guard; |
|
|
|
|
LogManager.repositorySelector = selector; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -183,94 +124,93 @@ public class LogManager {
|
|
|
|
|
* @param ex exception used to determine calling stack. |
|
|
|
|
* @return true if calling stack is recognized as likely safe. |
|
|
|
|
*/ |
|
|
|
|
private static boolean isLikelySafeScenario(final Exception ex) { |
|
|
|
|
StringWriter stringWriter = new StringWriter(); |
|
|
|
|
ex.printStackTrace(new PrintWriter(stringWriter)); |
|
|
|
|
String msg = stringWriter.toString(); |
|
|
|
|
return msg.indexOf("org.apache.catalina.loader.WebappClassLoader.stop") != -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static |
|
|
|
|
public |
|
|
|
|
LoggerRepository getLoggerRepository() { |
|
|
|
|
if (repositorySelector == null) { |
|
|
|
|
repositorySelector = new DefaultRepositorySelector(new NOPLoggerRepository()); |
|
|
|
|
guard = null; |
|
|
|
|
Exception ex = new IllegalStateException("Class invariant violation"); |
|
|
|
|
String msg = |
|
|
|
|
"log4j called after unloading, see http://logging.apache.org/log4j/1.2/faq.html#unload."; |
|
|
|
|
if (isLikelySafeScenario(ex)) { |
|
|
|
|
LogLog.debug(msg, ex); |
|
|
|
|
} else { |
|
|
|
|
LogLog.error(msg, ex); |
|
|
|
|
private static boolean isLikelySafeScenario(final Exception ex) { |
|
|
|
|
StringWriter stringWriter = new StringWriter(); |
|
|
|
|
ex.printStackTrace(new PrintWriter(stringWriter)); |
|
|
|
|
String msg = stringWriter.toString(); |
|
|
|
|
return msg.indexOf("org.apache.catalina.loader.WebappClassLoader.stop") != -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static |
|
|
|
|
public |
|
|
|
|
LoggerRepository getLoggerRepository() { |
|
|
|
|
if (repositorySelector == null) { |
|
|
|
|
repositorySelector = new DefaultRepositorySelector(new NOPLoggerRepository()); |
|
|
|
|
guard = null; |
|
|
|
|
Exception ex = new IllegalStateException("Class invariant violation"); |
|
|
|
|
String msg = |
|
|
|
|
"log4j called after unloading, see http://logging.apache.org/log4j/1.2/faq.html#unload."; |
|
|
|
|
if (isLikelySafeScenario(ex)) { |
|
|
|
|
LogLog.debug(msg, ex); |
|
|
|
|
} else { |
|
|
|
|
LogLog.error(msg, ex); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return repositorySelector.getLoggerRepository(); |
|
|
|
|
} |
|
|
|
|
return repositorySelector.getLoggerRepository(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
/** |
|
|
|
|
Retrieve the appropriate root logger. |
|
|
|
|
*/ |
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger getRootLogger() { |
|
|
|
|
// Delegate the actual manufacturing of the logger to the logger repository.
|
|
|
|
|
return getLoggerRepository().getRootLogger(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
*/ |
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger getRootLogger() { |
|
|
|
|
// Delegate the actual manufacturing of the logger to the logger repository.
|
|
|
|
|
return getLoggerRepository().getRootLogger(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
Retrieve the appropriate {@link Logger} instance. |
|
|
|
|
*/ |
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger getLogger(final String name) { |
|
|
|
|
// Delegate the actual manufacturing of the logger to the logger repository.
|
|
|
|
|
return getLoggerRepository().getLogger(name); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
*/ |
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger getLogger(final String name) { |
|
|
|
|
// Delegate the actual manufacturing of the logger to the logger repository.
|
|
|
|
|
return getLoggerRepository().getLogger(name); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
Retrieve the appropriate {@link Logger} instance. |
|
|
|
|
*/ |
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger getLogger(final Class clazz) { |
|
|
|
|
// Delegate the actual manufacturing of the logger to the logger repository.
|
|
|
|
|
return getLoggerRepository().getLogger(clazz.getName()); |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger getLogger(final Class clazz) { |
|
|
|
|
// Delegate the actual manufacturing of the logger to the logger repository.
|
|
|
|
|
return getLoggerRepository().getLogger(clazz.getName()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
/** |
|
|
|
|
Retrieve the appropriate {@link Logger} instance. |
|
|
|
|
*/ |
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger getLogger(final String name, final LoggerFactory factory) { |
|
|
|
|
// Delegate the actual manufacturing of the logger to the logger repository.
|
|
|
|
|
return getLoggerRepository().getLogger(name, factory); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger exists(final String name) { |
|
|
|
|
return getLoggerRepository().exists(name); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Enumeration getCurrentLoggers() { |
|
|
|
|
return getLoggerRepository().getCurrentLoggers(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
void shutdown() { |
|
|
|
|
getLoggerRepository().shutdown(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
void resetConfiguration() { |
|
|
|
|
getLoggerRepository().resetConfiguration(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger getLogger(final String name, final LoggerFactory factory) { |
|
|
|
|
// Delegate the actual manufacturing of the logger to the logger repository.
|
|
|
|
|
return getLoggerRepository().getLogger(name, factory); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Logger exists(final String name) { |
|
|
|
|
return getLoggerRepository().exists(name); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
Enumeration getCurrentLoggers() { |
|
|
|
|
return getLoggerRepository().getCurrentLoggers(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
void shutdown() { |
|
|
|
|
getLoggerRepository().shutdown(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public |
|
|
|
|
static |
|
|
|
|
void resetConfiguration() { |
|
|
|
|
getLoggerRepository().resetConfiguration(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|