| java.lang.Object org.apache.commons.logging.LogFactory
All known Subclasses: org.apache.commons.logging.impl.LogFactoryImpl, org.apache.commons.logging.tccl.custom.MyLogFactoryImpl,
LogFactory | abstract public class LogFactory (Code) | | Factory for creating
Log instances, with discovery and
configuration features similar to that employed by standard Java APIs
such as JAXP.
IMPLEMENTATION NOTE - This implementation is heavily
based on the SAXParserFactory and DocumentBuilderFactory implementations
(corresponding to the JAXP pluggability APIs) found in Apache Xerces.
author: Craig R. McClanahan author: Costin Manolache author: Richard A. Sitze version: $Revision: 399431 $ $Date: 2006-05-03 21:58:34 +0100 (Wed, 03 May 2006) $ |
Field Summary | |
final public static String | DIAGNOSTICS_DEST_PROPERTY The name (org.apache.commons.logging.diagnostics.dest )
of the property used to enable internal commons-logging
diagnostic output, in order to get information on what logging
implementations are being discovered, what classloaders they
are loaded through, etc.
If a system property of this name is set then the value is
assumed to be the name of a file. | final public static String | FACTORY_DEFAULT The fully qualified class name of the fallback LogFactory
implementation class to use, if no other can be found. | final public static String | FACTORY_PROPERTIES The name (commons-logging.properties ) of the properties file to search for. | final public static String | FACTORY_PROPERTY The name (org.apache.commons.logging.LogFactory ) of the property
used to identify the LogFactory implementation
class name. | final public static String | HASHTABLE_IMPLEMENTATION_PROPERTY Setting this system property
(org.apache.commons.logging.LogFactory.HashtableImpl )
value allows the Hashtable used to store
classloaders to be substituted by an alternative implementation. | final public static String | PRIORITY_KEY The name (priority ) of the key in the config file used to
specify the priority of that particular config file. | final protected static String | SERVICE_ID JDK1.3+
'Service Provider' specification. | final public static String | TCCL_KEY The name (use_tccl ) of the key in the config file used
to specify whether logging classes should be loaded via the thread
context class loader (TCCL), or not. | protected static Hashtable | factories The previously constructed LogFactory instances, keyed by
the ClassLoader with which it was created. | protected static LogFactory | nullClassLoaderFactory Prevously constructed LogFactory instance as in the
factories map, but for the case where
getClassLoader returns null . |
Constructor Summary | |
protected | LogFactory() Protected constructor that is not available for public use. |
Method Summary | |
protected static Object | createFactory(String factoryClass, ClassLoader classLoader) Implements the operations described in the javadoc for newFactory.
Parameters: factoryClass - Parameters: classLoader - used to load the specified factory class. | protected static ClassLoader | directGetContextClassLoader() Return the thread context class loader if available; otherwise return
null. | abstract public Object | getAttribute(String name) Return the configuration attribute with the specified name (if any),
or null if there is no such attribute. | abstract public String[] | getAttributeNames() Return an array containing the names of all currently defined
configuration attributes. | protected static ClassLoader | getClassLoader(Class clazz) Safely get access to the classloader for the specified class.
Theoretically, calling getClassLoader can throw a security exception,
and so should be done under an AccessController in order to provide
maximum flexibility. | protected static ClassLoader | getContextClassLoader() Calls LogFactory.directGetContextClassLoader under the control of an
AccessController class. | public static LogFactory | getFactory() Construct (if necessary) and return a LogFactory
instance, using the following ordered lookup procedure to determine
the name of the implementation class to be loaded.
- The
org.apache.commons.logging.LogFactory system
property.
- The JDK 1.3 Service Discovery mechanism
- Use the properties file
commons-logging.properties
file, if found in the class path of this class. | abstract public Log | getInstance(Class clazz) Convenience method to derive a name from the specified class and
call getInstance(String) with it. | abstract public Log | getInstance(String name) | public static Log | getLog(Class clazz) Convenience method to return a named logger, without the application
having to care about factories. | public static Log | getLog(String name) Convenience method to return a named logger, without the application
having to care about factories. | protected static boolean | isDiagnosticsEnabled() Indicates true if the user has enabled internal logging. | final protected static void | logRawDiagnostic(String msg) Write the specified message to the internal logging destination. | protected static LogFactory | newFactory(String factoryClass, ClassLoader classLoader, ClassLoader contextClassLoader) Return a new instance of the specified LogFactory
implementation class, loaded by the specified class loader.
If that fails, try the class loader used to load this
(abstract) LogFactory.
ClassLoader conflicts
Note that there can be problems if the specified ClassLoader is not the
same as the classloader that loaded this class, ie when loading a
concrete LogFactory subclass via a context classloader.
The problem is the same one that can occur when loading a concrete Log
subclass via a context classloader.
The problem occurs when code running in the context classloader calls
class X which was loaded via a parent classloader, and class X then calls
LogFactory.getFactory (either directly or via LogFactory.getLog). | protected static LogFactory | newFactory(String factoryClass, ClassLoader classLoader) Method provided for backwards compatibility; see newFactory version that
takes 3 parameters.
This method would only ever be called in some rather odd situation.
Note that this method is static, so overriding in a subclass doesn't
have any effect unless this method is called from a method in that
subclass. | public static String | objectId(Object o) Returns a string that uniquely identifies the specified object, including
its class.
The returned string is of form "classname@hashcode", ie is the same as
the return value of the Object.toString() method, but works even when
the specified object's class has overidden the toString method.
Parameters: o - may be null. | abstract public void | release() Release any internal references to previously created
Log instances returned by this factory. | public static void | release(ClassLoader classLoader) Release any internal references to previously created
LogFactory instances that have been associated with the specified class loader
(if any), after calling the instance method release() on
each of them. | public static void | releaseAll() Release any internal references to previously created
LogFactory instances, after calling the instance method release() on
each of them. | abstract public void | removeAttribute(String name) Remove any configuration attribute associated with the specified name. | abstract public void | setAttribute(String name, Object value) Set the configuration attribute with the specified name. |
DIAGNOSTICS_DEST_PROPERTY | final public static String DIAGNOSTICS_DEST_PROPERTY(Code) | | The name (org.apache.commons.logging.diagnostics.dest )
of the property used to enable internal commons-logging
diagnostic output, in order to get information on what logging
implementations are being discovered, what classloaders they
are loaded through, etc.
If a system property of this name is set then the value is
assumed to be the name of a file. The special strings
STDOUT or STDERR (case-sensitive) indicate output to
System.out and System.err respectively.
Diagnostic logging should be used only to debug problematic
configurations and should not be set in normal production use.
|
FACTORY_DEFAULT | final public static String FACTORY_DEFAULT(Code) | | The fully qualified class name of the fallback LogFactory
implementation class to use, if no other can be found.
|
FACTORY_PROPERTIES | final public static String FACTORY_PROPERTIES(Code) | | The name (commons-logging.properties ) of the properties file to search for.
|
FACTORY_PROPERTY | final public static String FACTORY_PROPERTY(Code) | | The name (org.apache.commons.logging.LogFactory ) of the property
used to identify the LogFactory implementation
class name. This can be used as a system property, or as an entry in a
configuration properties file.
|
HASHTABLE_IMPLEMENTATION_PROPERTY | final public static String HASHTABLE_IMPLEMENTATION_PROPERTY(Code) | | Setting this system property
(org.apache.commons.logging.LogFactory.HashtableImpl )
value allows the Hashtable used to store
classloaders to be substituted by an alternative implementation.
Note: LogFactory will print:
[ERROR] LogFactory: Load of custom hashtable failed
to system error and then continue using a standard Hashtable.
Usage: Set this property when Java is invoked
and LogFactory will attempt to load a new instance
of the given implementation class.
For example, running the following ant scriplet:
<java classname="${test.runner}" fork="yes" failonerror="${test.failonerror}">
...
<sysproperty
key="org.apache.commons.logging.LogFactory.HashtableImpl"
value="org.apache.commons.logging.AltHashtable"/>
</java>
will mean that LogFactory will load an instance of
org.apache.commons.logging.AltHashtable .
A typical use case is to allow a custom
Hashtable implementation using weak references to be substituted.
This will allow classloaders to be garbage collected without
the need to release them (on 1.3+ JVMs only, of course ;)
|
PRIORITY_KEY | final public static String PRIORITY_KEY(Code) | | The name (priority ) of the key in the config file used to
specify the priority of that particular config file. The associated value
is a floating-point number; higher values take priority over lower values.
|
TCCL_KEY | final public static String TCCL_KEY(Code) | | The name (use_tccl ) of the key in the config file used
to specify whether logging classes should be loaded via the thread
context class loader (TCCL), or not. By default, the TCCL is used.
|
factories | protected static Hashtable factories(Code) | | The previously constructed LogFactory instances, keyed by
the ClassLoader with which it was created.
|
nullClassLoaderFactory | protected static LogFactory nullClassLoaderFactory(Code) | | Prevously constructed LogFactory instance as in the
factories map, but for the case where
getClassLoader returns null .
This can happen when:
- using JDK1.1 and the calling code is loaded via the system
classloader (very common)
- using JDK1.2+ and the calling code is loaded via the boot
classloader (only likely for embedded systems work).
Note that factories is a Hashtable (not a HashMap),
and hashtables don't allow null as a key.
|
LogFactory | protected LogFactory()(Code) | | Protected constructor that is not available for public use.
|
createFactory | protected static Object createFactory(String factoryClass, ClassLoader classLoader)(Code) | | Implements the operations described in the javadoc for newFactory.
Parameters: factoryClass - Parameters: classLoader - used to load the specified factory class. This isexpected to be either the TCCL or the classloader which loaded thisclass. Note that the classloader which loaded this class might be"null" (ie the bootloader) for embedded systems. either a LogFactory object or a LogConfigurationException object. since: 1.1 |
directGetContextClassLoader | protected static ClassLoader directGetContextClassLoader() throws LogConfigurationException(Code) | | Return the thread context class loader if available; otherwise return
null.
Most/all code should call getContextClassLoader rather than calling
this method directly.
The thread context class loader is available for JDK 1.2
or later, if certain security conditions are met.
Note that no internal logging is done within this method because
this method is called every time LogFactory.getLogger() is called,
and we don't want too much output generated here.
exception: LogConfigurationException - if a suitable class loadercannot be identified. exception: SecurityException - if the java security policy forbidsaccess to the context classloader from one of the classes in thecurrent call stack. since: 1.1 |
getAttribute | abstract public Object getAttribute(String name)(Code) | | Return the configuration attribute with the specified name (if any),
or null if there is no such attribute.
Parameters: name - Name of the attribute to return |
getAttributeNames | abstract public String[] getAttributeNames()(Code) | | Return an array containing the names of all currently defined
configuration attributes. If there are no such attributes, a zero
length array is returned.
|
getClassLoader | protected static ClassLoader getClassLoader(Class clazz)(Code) | | Safely get access to the classloader for the specified class.
Theoretically, calling getClassLoader can throw a security exception,
and so should be done under an AccessController in order to provide
maximum flexibility. However in practice people don't appear to use
security policies that forbid getClassLoader calls. So for the moment
all code is written to call this method rather than Class.getClassLoader,
so that we could put AccessController stuff in this method without any
disruption later if we need to.
Even when using an AccessController, however, this method can still
throw SecurityException. Commons-logging basically relies on the
ability to access classloaders, ie a policy that forbids all
classloader access will also prevent commons-logging from working:
currently this method will throw an exception preventing the entire app
from starting up. Maybe it would be good to detect this situation and
just disable all commons-logging? Not high priority though - as stated
above, security policies that prevent classloader access aren't common.
since: 1.1 |
getContextClassLoader | protected static ClassLoader getContextClassLoader() throws LogConfigurationException(Code) | | Calls LogFactory.directGetContextClassLoader under the control of an
AccessController class. This means that java code running under a
security manager that forbids access to ClassLoaders will still work
if this class is given appropriate privileges, even when the caller
doesn't have such privileges. Without using an AccessController, the
the entire call stack must have the privilege before the call is
allowed.
the context classloader associated with the current thread,or null if security doesn't allow it. throws: LogConfigurationException - if there was some weird error whileattempting to get the context classloader. throws: SecurityException - if the current java security policy doesn'tallow this class to access the context classloader. |
getFactory | public static LogFactory getFactory() throws LogConfigurationException(Code) | | Construct (if necessary) and return a LogFactory
instance, using the following ordered lookup procedure to determine
the name of the implementation class to be loaded.
- The
org.apache.commons.logging.LogFactory system
property.
- The JDK 1.3 Service Discovery mechanism
- Use the properties file
commons-logging.properties
file, if found in the class path of this class. The configuration
file is in standard java.util.Properties format and
contains the fully qualified name of the implementation class
with the key being the system property defined above.
- Fall back to a default implementation class
(
org.apache.commons.logging.impl.LogFactoryImpl ).
NOTE - If the properties file method of identifying the
LogFactory implementation class is utilized, all of the
properties defined in this file will be set as configuration attributes
on the corresponding LogFactory instance.
NOTE - In a multithreaded environment it is possible
that two different instances will be returned for the same
classloader environment.
exception: LogConfigurationException - if the implementation class is notavailable or cannot be instantiated. |
getInstance | abstract public Log getInstance(Class clazz) throws LogConfigurationException(Code) | | Convenience method to derive a name from the specified class and
call getInstance(String) with it.
Parameters: clazz - Class for which a suitable Log name will be derived exception: LogConfigurationException - if a suitable Log instance cannot be returned |
getInstance | abstract public Log getInstance(String name) throws LogConfigurationException(Code) | | Construct (if necessary) and return a Log instance,
using the factory's current set of configuration attributes.
NOTE - Depending upon the implementation of
the LogFactory you are using, the Log
instance you are returned may or may not be local to the current
application, and may or may not be returned again on a subsequent
call with the same name argument.
Parameters: name - Logical name of the Log instance to bereturned (the meaning of this name is only known to the underlyinglogging implementation that is being wrapped) exception: LogConfigurationException - if a suitable Log instance cannot be returned |
getLog | public static Log getLog(Class clazz) throws LogConfigurationException(Code) | | Convenience method to return a named logger, without the application
having to care about factories.
Parameters: clazz - Class from which a log name will be derived exception: LogConfigurationException - if a suitable Log instance cannot be returned |
getLog | public static Log getLog(String name) throws LogConfigurationException(Code) | | Convenience method to return a named logger, without the application
having to care about factories.
Parameters: name - Logical name of the Log instance to bereturned (the meaning of this name is only known to the underlyinglogging implementation that is being wrapped) exception: LogConfigurationException - if a suitable Log instance cannot be returned |
isDiagnosticsEnabled | protected static boolean isDiagnosticsEnabled()(Code) | | Indicates true if the user has enabled internal logging.
By the way, sorry for the incorrect grammar, but calling this method
areDiagnosticsEnabled just isn't java beans style.
true if calls to logDiagnostic will have any effect. since: 1.1 |
logRawDiagnostic | final protected static void logRawDiagnostic(String msg)(Code) | | Write the specified message to the internal logging destination.
Parameters: msg - is the diagnostic message to be output. since: 1.1 |
newFactory | protected static LogFactory newFactory(String factoryClass, ClassLoader classLoader, ClassLoader contextClassLoader) throws LogConfigurationException(Code) | | Return a new instance of the specified LogFactory
implementation class, loaded by the specified class loader.
If that fails, try the class loader used to load this
(abstract) LogFactory.
ClassLoader conflicts
Note that there can be problems if the specified ClassLoader is not the
same as the classloader that loaded this class, ie when loading a
concrete LogFactory subclass via a context classloader.
The problem is the same one that can occur when loading a concrete Log
subclass via a context classloader.
The problem occurs when code running in the context classloader calls
class X which was loaded via a parent classloader, and class X then calls
LogFactory.getFactory (either directly or via LogFactory.getLog). Because
class X was loaded via the parent, it binds to LogFactory loaded via
the parent. When the code in this method finds some LogFactoryYYYY
class in the child (context) classloader, and there also happens to be a
LogFactory class defined in the child classloader, then LogFactoryYYYY
will be bound to LogFactory@childloader. It cannot be cast to
LogFactory@parentloader, ie this method cannot return the object as
the desired type. Note that it doesn't matter if the LogFactory class
in the child classloader is identical to the LogFactory class in the
parent classloader, they are not compatible.
The solution taken here is to simply print out an error message when
this occurs then throw an exception. The deployer of the application
must ensure they remove all occurrences of the LogFactory class from
the child classloader in order to resolve the issue. Note that they
do not have to move the custom LogFactory subclass; that is ok as
long as the only LogFactory class it can find to bind to is in the
parent classloader.
Parameters: factoryClass - Fully qualified name of the LogFactory implementation class Parameters: classLoader - ClassLoader from which to load this class Parameters: contextClassLoader - is the context that this new factory willmanage logging for. exception: LogConfigurationException - if a suitable instancecannot be created since: 1.1 |
newFactory | protected static LogFactory newFactory(String factoryClass, ClassLoader classLoader)(Code) | | Method provided for backwards compatibility; see newFactory version that
takes 3 parameters.
This method would only ever be called in some rather odd situation.
Note that this method is static, so overriding in a subclass doesn't
have any effect unless this method is called from a method in that
subclass. However this method only makes sense to use from the
getFactory method, and as that is almost always invoked via
LogFactory.getFactory, any custom definition in a subclass would be
pointless. Only a class with a custom getFactory method, then invoked
directly via CustomFactoryImpl.getFactory or similar would ever call
this. Anyway, it's here just in case, though the "managed class loader"
value output to the diagnostics will not report the correct value.
|
objectId | public static String objectId(Object o)(Code) | | Returns a string that uniquely identifies the specified object, including
its class.
The returned string is of form "classname@hashcode", ie is the same as
the return value of the Object.toString() method, but works even when
the specified object's class has overidden the toString method.
Parameters: o - may be null. a string of form classname@hashcode, or "null" if param o is null. since: 1.1 |
release | abstract public void release()(Code) | | Release any internal references to previously created
Log instances returned by this factory. This is useful in environments
like servlet containers, which implement application reloading by
throwing away a ClassLoader. Dangling references to objects in that
class loader would prevent garbage collection.
|
release | public static void release(ClassLoader classLoader)(Code) | | Release any internal references to previously created
LogFactory instances that have been associated with the specified class loader
(if any), after calling the instance method release() on
each of them.
Parameters: classLoader - ClassLoader for which to release the LogFactory |
releaseAll | public static void releaseAll()(Code) | | Release any internal references to previously created
LogFactory instances, after calling the instance method release() on
each of them. This is useful in environments like servlet containers,
which implement application reloading by throwing away a ClassLoader.
Dangling references to objects in that class loader would prevent
garbage collection.
|
removeAttribute | abstract public void removeAttribute(String name)(Code) | | Remove any configuration attribute associated with the specified name.
If there is no such attribute, no action is taken.
Parameters: name - Name of the attribute to remove |
setAttribute | abstract public void setAttribute(String name, Object value)(Code) | | Set the configuration attribute with the specified name. Calling
this with a null value is equivalent to calling
removeAttribute(name) .
Parameters: name - Name of the attribute to set Parameters: value - Value of the attribute to set, or null to remove any setting for this attribute |
|
|