@ -17,6 +17,7 @@
package org.apache.commons.logging ;
package org.apache.commons.logging ;
import java.io.Serializable ;
import java.io.Serializable ;
import java.util.logging.LogRecord ;
import org.apache.logging.log4j.Level ;
import org.apache.logging.log4j.Level ;
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.LogManager ;
@ -28,13 +29,14 @@ import org.slf4j.spi.LocationAwareLogger;
/ * *
/ * *
* A minimal incarnation of Apache Commons Logging ' s { @code LogFactory } API ,
* A minimal incarnation of Apache Commons Logging ' s { @code LogFactory } API ,
* providing just the two common static { @link Log } lookup methods .
* providing just the common { @link Log } lookup methods . This is inspired
* This should be source and binary compatible with all common use of the
* by the JCL - over - SLF4J bridge and should be source as well as binary
* Commons Logging API ( i . e . { @code LogFactory . getLog ( Class / String ) } setup ) .
* compatible with all common use of the Commons Logging API ( in particular :
* with { @code LogFactory . getLog ( Class / String ) } field initializers ) .
*
*
* < p > This implementation does not support any of Commons Logging ' s flexible
* < p > This implementation does not support Commons Logging ' s original provider
* configura tion . It rather only checks for the presence of the Log4J 2 . x API
* dete ction. It rather only checks for the presence of the Log4j 2 . x API
* and the SLF4J 1 . 7 API in the f ramework classpath , falling back to
* and the SLF4J 1 . 7 API in the Spring F ramework classpath , falling back to
* { @code java . util . logging } if none of the two is available . In that sense ,
* { @code java . util . logging } if none of the two is available . In that sense ,
* it works as a replacement for the Log4j 2 Commons Logging bridge as well as
* it works as a replacement for the Log4j 2 Commons Logging bridge as well as
* the JCL - over - SLF4J bridge , both of which become irrelevant for Spring - based
* the JCL - over - SLF4J bridge , both of which become irrelevant for Spring - based
@ -42,11 +44,18 @@ import org.slf4j.spi.LocationAwareLogger;
* Commons Logging API jar anymore either ) . Furthermore , for simple setups
* Commons Logging API jar anymore either ) . Furthermore , for simple setups
* without an external logging provider , Spring does not require any extra jar
* without an external logging provider , Spring does not require any extra jar
* on the classpath anymore since this embedded log factory automatically
* on the classpath anymore since this embedded log factory automatically
* switch es to { @code java . util . logging } in such a scenario .
* delegat es to { @code java . util . logging } in such a scenario .
*
*
* < p > < b > Note that this Commons Logging variant is only meant to be used for
* < p > < b > Note that this Commons Logging variant is only meant to be used for
* framework logging purposes , both in the core framework and in extensions . < / b >
* infrastructure logging purposes in the core framework and in extensions . < / b >
* For applications , prefer direct use of Log4J or SLF4J or { @code java . util . logging } .
* It also serves as a common bridge for third - party libraries using the
* Commons Logging API , e . g . Apache HttpClient , Castor and HtmlUnit , bringing
* them into the same consistent arrangement without any extra bridge jars .
*
* < p > < b > For logging need in application code , prefer direct use of Log4j 2 . x
* or SLF4J or { @code java . util . logging } . < / b > Simply put Log4j 2 . x or Logback
* ( or another SLF4J provider ) onto your classpath , without any extra bridges ,
* and let the framework auto - adapt to your choice .
*
*
* @author Juergen Hoeller
* @author Juergen Hoeller
* @since 5 . 0
* @since 5 . 0
@ -58,11 +67,11 @@ public abstract class LogFactory {
static {
static {
ClassLoader cl = LogFactory . class . getClassLoader ( ) ;
ClassLoader cl = LogFactory . class . getClassLoader ( ) ;
try {
try {
// Try Log4J 2.x API
// Try Log4j 2.x API
cl . loadClass ( "org.apache.logging.log4j.spi.ExtendedLogger" ) ;
cl . loadClass ( "org.apache.logging.log4j.spi.ExtendedLogger" ) ;
logApi = LogApi . LOG4J ;
logApi = LogApi . LOG4J ;
}
}
catch ( ClassNotFoundException ex ) {
catch ( ClassNotFoundException ex1 ) {
try {
try {
// Try SLF4J 1.7 SPI
// Try SLF4J 1.7 SPI
cl . loadClass ( "org.slf4j.spi.LocationAwareLogger" ) ;
cl . loadClass ( "org.slf4j.spi.LocationAwareLogger" ) ;
@ -103,7 +112,13 @@ public abstract class LogFactory {
case SLF4J :
case SLF4J :
return Slf4jDelegate . createLog ( name ) ;
return Slf4jDelegate . createLog ( name ) ;
default :
default :
return new JavaUtilLog ( name ) ;
// Defensively use lazy-initializing delegate class here as well since the
// java.logging module is not present by default on JDK 9. We are requiring
// its presence if neither Log4j nor SLF4J is available; however, in the
// case of Log4j or SLF4J, we are trying to prevent early initialization
// of the JavaUtilLog adapter - e.g. by a JVM in debug mode - when eagerly
// trying to parse the bytecode for all the cases of this switch clause.
return JavaUtilDelegate . createLog ( name ) ;
}
}
}
}
@ -167,6 +182,14 @@ public abstract class LogFactory {
}
}
private static class JavaUtilDelegate {
public static Log createLog ( String name ) {
return new JavaUtilLog ( name ) ;
}
}
@SuppressWarnings ( "serial" )
@SuppressWarnings ( "serial" )
private static class Log4jLog implements Log , Serializable {
private static class Log4jLog implements Log , Serializable {
@ -182,8 +205,8 @@ public abstract class LogFactory {
}
}
@Override
@Override
public boolean isDebug Enabled ( ) {
public boolean isFatal Enabled ( ) {
return logger . isEnabled ( Level . DEBUG , null , null ) ;
return logger . isEnabled ( Level . FATAL , null , null ) ;
}
}
@Override
@Override
@ -192,8 +215,8 @@ public abstract class LogFactory {
}
}
@Override
@Override
public boolean isFatal Enabled ( ) {
public boolean isWarn Enabled ( ) {
return logger . isEnabled ( Level . FATAL , null , null ) ;
return logger . isEnabled ( Level . WARN , null , null ) ;
}
}
@Override
@Override
@ -202,23 +225,23 @@ public abstract class LogFactory {
}
}
@Override
@Override
public boolean isTrace Enabled ( ) {
public boolean isDebug Enabled ( ) {
return logger . isEnabled ( Level . TRACE , null , null ) ;
return logger . isEnabled ( Level . DEBUG , null , null ) ;
}
}
@Override
@Override
public boolean isWarn Enabled ( ) {
public boolean isTrace Enabled ( ) {
return logger . isEnabled ( Level . WARN , null , null ) ;
return logger . isEnabled ( Level . TRACE , null , null ) ;
}
}
@Override
@Override
public void debug ( Object message ) {
public void fatal ( Object message ) {
logger . logIfEnabled ( FQCN , Level . DEBUG , null , message , null ) ;
logger . logIfEnabled ( FQCN , Level . FATAL , null , message , null ) ;
}
}
@Override
@Override
public void debug ( Object message , Throwable exception ) {
public void fatal ( Object message , Throwable exception ) {
logger . logIfEnabled ( FQCN , Level . DEBUG , null , message , exception ) ;
logger . logIfEnabled ( FQCN , Level . FATAL , null , message , exception ) ;
}
}
@Override
@Override
@ -232,13 +255,13 @@ public abstract class LogFactory {
}
}
@Override
@Override
public void fatal ( Object message ) {
public void warn ( Object message ) {
logger . logIfEnabled ( FQCN , Level . FATAL , null , message , null ) ;
logger . logIfEnabled ( FQCN , Level . WARN , null , message , null ) ;
}
}
@Override
@Override
public void fatal ( Object message , Throwable exception ) {
public void warn ( Object message , Throwable exception ) {
logger . logIfEnabled ( FQCN , Level . FATAL , null , message , exception ) ;
logger . logIfEnabled ( FQCN , Level . WARN , null , message , exception ) ;
}
}
@Override
@Override
@ -252,23 +275,23 @@ public abstract class LogFactory {
}
}
@Override
@Override
public void trace ( Object message ) {
public void debug ( Object message ) {
logger . logIfEnabled ( FQCN , Level . TRACE , null , message , null ) ;
logger . logIfEnabled ( FQCN , Level . DEBUG , null , message , null ) ;
}
}
@Override
@Override
public void trace ( Object message , Throwable exception ) {
public void debug ( Object message , Throwable exception ) {
logger . logIfEnabled ( FQCN , Level . TRACE , null , message , exception ) ;
logger . logIfEnabled ( FQCN , Level . DEBUG , null , message , exception ) ;
}
}
@Override
@Override
public void warn ( Object message ) {
public void trace ( Object message ) {
logger . logIfEnabled ( FQCN , Level . WARN , null , message , null ) ;
logger . logIfEnabled ( FQCN , Level . TRACE , null , message , null ) ;
}
}
@Override
@Override
public void warn ( Object message , Throwable exception ) {
public void trace ( Object message , Throwable exception ) {
logger . logIfEnabled ( FQCN , Level . WARN , null , message , exception ) ;
logger . logIfEnabled ( FQCN , Level . TRACE , null , message , exception ) ;
}
}
}
}
@ -285,40 +308,36 @@ public abstract class LogFactory {
this . logger = logger ;
this . logger = logger ;
}
}
public boolean isDebug Enabled ( ) {
public boolean isFatal Enabled ( ) {
return this . logger . isDebug Enabled( ) ;
return isError Enabled( ) ;
}
}
public boolean isErrorEnabled ( ) {
public boolean isErrorEnabled ( ) {
return this . logger . isErrorEnabled ( ) ;
return this . logger . isErrorEnabled ( ) ;
}
}
public boolean isFatal Enabled ( ) {
public boolean isWarn Enabled ( ) {
return this . logger . isError Enabled ( ) ;
return this . logger . isWarn Enabled ( ) ;
}
}
public boolean isInfoEnabled ( ) {
public boolean isInfoEnabled ( ) {
return this . logger . isInfoEnabled ( ) ;
return this . logger . isInfoEnabled ( ) ;
}
}
public boolean isTrace Enabled ( ) {
public boolean isDebug Enabled ( ) {
return this . logger . isTrace Enabled ( ) ;
return this . logger . isDebug Enabled ( ) ;
}
}
public boolean isWarn Enabled ( ) {
public boolean isTrace Enabled ( ) {
return this . logger . isWarn Enabled ( ) ;
return this . logger . isTrace Enabled ( ) ;
}
}
public void debug ( Object message ) {
public void fatal ( Object message ) {
if ( message instanceof String | | this . logger . isDebugEnabled ( ) ) {
error ( message ) ;
this . logger . debug ( String . valueOf ( message ) ) ;
}
}
}
public void debug ( Object message , Throwable exception ) {
public void fatal ( Object message , Throwable exception ) {
if ( message instanceof String | | this . logger . isDebugEnabled ( ) ) {
error ( message , exception ) ;
this . logger . debug ( String . valueOf ( message ) , exception ) ;
}
}
}
public void error ( Object message ) {
public void error ( Object message ) {
@ -333,12 +352,16 @@ public abstract class LogFactory {
}
}
}
}
public void fatal ( Object message ) {
public void warn ( Object message ) {
error ( message ) ;
if ( message instanceof String | | this . logger . isWarnEnabled ( ) ) {
this . logger . warn ( String . valueOf ( message ) ) ;
}
}
}
public void fatal ( Object message , Throwable exception ) {
public void warn ( Object message , Throwable exception ) {
error ( message , exception ) ;
if ( message instanceof String | | this . logger . isWarnEnabled ( ) ) {
this . logger . warn ( String . valueOf ( message ) , exception ) ;
}
}
}
public void info ( Object message ) {
public void info ( Object message ) {
@ -353,27 +376,27 @@ public abstract class LogFactory {
}
}
}
}
public void trace ( Object message ) {
public void debug ( Object message ) {
if ( message instanceof String | | this . logger . isTrace Enabled ( ) ) {
if ( message instanceof String | | this . logger . isDebug Enabled ( ) ) {
this . logger . trace ( String . valueOf ( message ) ) ;
this . logger . debug ( String . valueOf ( message ) ) ;
}
}
}
}
public void trace ( Object message , Throwable exception ) {
public void debug ( Object message , Throwable exception ) {
if ( message instanceof String | | this . logger . isTrace Enabled ( ) ) {
if ( message instanceof String | | this . logger . isDebug Enabled ( ) ) {
this . logger . trace ( String . valueOf ( message ) , exception ) ;
this . logger . debug ( String . valueOf ( message ) , exception ) ;
}
}
}
}
public void warn ( Object message ) {
public void trace ( Object message ) {
if ( message instanceof String | | this . logger . isWarn Enabled ( ) ) {
if ( message instanceof String | | this . logger . isTrace Enabled ( ) ) {
this . logger . warn ( String . valueOf ( message ) ) ;
this . logger . trace ( String . valueOf ( message ) ) ;
}
}
}
}
public void warn ( Object message , Throwable exception ) {
public void trace ( Object message , Throwable exception ) {
if ( message instanceof String | | this . logger . isWarn Enabled ( ) ) {
if ( message instanceof String | | this . logger . isTrace Enabled ( ) ) {
this . logger . warn ( String . valueOf ( message ) , exception ) ;
this . logger . trace ( String . valueOf ( message ) , exception ) ;
}
}
}
}
@ -392,16 +415,12 @@ public abstract class LogFactory {
super ( logger ) ;
super ( logger ) ;
}
}
public void debug ( Object message ) {
public void fatal ( Object message ) {
if ( message instanceof String | | this . logger . isDebugEnabled ( ) ) {
error ( message ) ;
this . logger . log ( null , FQCN , LocationAwareLogger . DEBUG_INT , String . valueOf ( message ) , null , null ) ;
}
}
}
public void debug ( Object message , Throwable exception ) {
public void fatal ( Object message , Throwable exception ) {
if ( message instanceof String | | this . logger . isDebugEnabled ( ) ) {
error ( message , exception ) ;
this . logger . log ( null , FQCN , LocationAwareLogger . DEBUG_INT , String . valueOf ( message ) , null , exception ) ;
}
}
}
public void error ( Object message ) {
public void error ( Object message ) {
@ -416,12 +435,16 @@ public abstract class LogFactory {
}
}
}
}
public void fatal ( Object message ) {
public void warn ( Object message ) {
error ( message ) ;
if ( message instanceof String | | this . logger . isWarnEnabled ( ) ) {
this . logger . log ( null , FQCN , LocationAwareLogger . WARN_INT , String . valueOf ( message ) , null , null ) ;
}
}
}
public void fatal ( Object message , Throwable exception ) {
public void warn ( Object message , Throwable exception ) {
error ( message , exception ) ;
if ( message instanceof String | | this . logger . isWarnEnabled ( ) ) {
this . logger . log ( null , FQCN , LocationAwareLogger . WARN_INT , String . valueOf ( message ) , null , exception ) ;
}
}
}
public void info ( Object message ) {
public void info ( Object message ) {
@ -436,27 +459,27 @@ public abstract class LogFactory {
}
}
}
}
public void trace ( Object message ) {
public void debug ( Object message ) {
if ( message instanceof String | | this . logger . isTrace Enabled ( ) ) {
if ( message instanceof String | | this . logger . isDebug Enabled ( ) ) {
this . logger . log ( null , FQCN , LocationAwareLogger . TRACE _INT, String . valueOf ( message ) , null , null ) ;
this . logger . log ( null , FQCN , LocationAwareLogger . DEBUG _INT, String . valueOf ( message ) , null , null ) ;
}
}
}
}
public void trace ( Object message , Throwable exception ) {
public void debug ( Object message , Throwable exception ) {
if ( message instanceof String | | this . logger . isTrace Enabled ( ) ) {
if ( message instanceof String | | this . logger . isDebug Enabled ( ) ) {
this . logger . log ( null , FQCN , LocationAwareLogger . TRACE _INT, String . valueOf ( message ) , null , exception ) ;
this . logger . log ( null , FQCN , LocationAwareLogger . DEBUG _INT, String . valueOf ( message ) , null , exception ) ;
}
}
}
}
public void warn ( Object message ) {
public void trace ( Object message ) {
if ( message instanceof String | | this . logger . isWarn Enabled ( ) ) {
if ( message instanceof String | | this . logger . isTrace Enabled ( ) ) {
this . logger . log ( null , FQCN , LocationAwareLogger . WARN _INT, String . valueOf ( message ) , null , null ) ;
this . logger . log ( null , FQCN , LocationAwareLogger . TRACE _INT, String . valueOf ( message ) , null , null ) ;
}
}
}
}
public void warn ( Object message , Throwable exception ) {
public void trace ( Object message , Throwable exception ) {
if ( message instanceof String | | this . logger . isWarn Enabled ( ) ) {
if ( message instanceof String | | this . logger . isTrace Enabled ( ) ) {
this . logger . log ( null , FQCN , LocationAwareLogger . WARN _INT, String . valueOf ( message ) , null , exception ) ;
this . logger . log ( null , FQCN , LocationAwareLogger . TRACE _INT, String . valueOf ( message ) , null , exception ) ;
}
}
}
}
@ -478,36 +501,36 @@ public abstract class LogFactory {
this . logger = java . util . logging . Logger . getLogger ( name ) ;
this . logger = java . util . logging . Logger . getLogger ( name ) ;
}
}
public boolean isDebug Enabled ( ) {
public boolean isFatal Enabled ( ) {
return this . logger . isLoggable ( java . util . logging . Level . FINE ) ;
return isErrorEnabled ( ) ;
}
}
public boolean isErrorEnabled ( ) {
public boolean isErrorEnabled ( ) {
return this . logger . isLoggable ( java . util . logging . Level . SEVERE ) ;
return this . logger . isLoggable ( java . util . logging . Level . SEVERE ) ;
}
}
public boolean isFatal Enabled ( ) {
public boolean isWarn Enabled ( ) {
return this . logger . isLoggable ( java . util . logging . Level . SEVERE ) ;
return this . logger . isLoggable ( java . util . logging . Level . WARNING ) ;
}
}
public boolean isInfoEnabled ( ) {
public boolean isInfoEnabled ( ) {
return this . logger . isLoggable ( java . util . logging . Level . INFO ) ;
return this . logger . isLoggable ( java . util . logging . Level . INFO ) ;
}
}
public boolean isTrace Enabled ( ) {
public boolean isDebug Enabled ( ) {
return this . logger . isLoggable ( java . util . logging . Level . FINEST ) ;
return this . logger . isLoggable ( java . util . logging . Level . FINE ) ;
}
}
public boolean isWarn Enabled ( ) {
public boolean isTrace Enabled ( ) {
return this . logger . isLoggable ( java . util . logging . Level . WARNING ) ;
return this . logger . isLoggable ( java . util . logging . Level . FINEST ) ;
}
}
public void debug ( Object message ) {
public void fatal ( Object message ) {
log ( java . util . logging . Level . FINE , message , null ) ;
error ( message ) ;
}
}
public void debug ( Object message , Throwable exception ) {
public void fatal ( Object message , Throwable exception ) {
log ( java . util . logging . Level . FINE , message , exception ) ;
error ( message , exception ) ;
}
}
public void error ( Object message ) {
public void error ( Object message ) {
@ -518,12 +541,12 @@ public abstract class LogFactory {
log ( java . util . logging . Level . SEVERE , message , exception ) ;
log ( java . util . logging . Level . SEVERE , message , exception ) ;
}
}
public void fatal ( Object message ) {
public void warn ( Object message ) {
error ( message ) ;
log ( java . util . logging . Level . WARNING , message , null ) ;
}
}
public void fatal ( Object message , Throwable exception ) {
public void warn ( Object message , Throwable exception ) {
error ( message , exception ) ;
log ( java . util . logging . Level . WARNING , message , exception ) ;
}
}
public void info ( Object message ) {
public void info ( Object message ) {
@ -534,29 +557,35 @@ public abstract class LogFactory {
log ( java . util . logging . Level . INFO , message , exception ) ;
log ( java . util . logging . Level . INFO , message , exception ) ;
}
}
public void trace ( Object message ) {
public void debug ( Object message ) {
log ( java . util . logging . Level . FINEST , message , null ) ;
log ( java . util . logging . Level . FINE , message , null ) ;
}
}
public void trace ( Object message , Throwable exception ) {
public void debug ( Object message , Throwable exception ) {
log ( java . util . logging . Level . FINEST , message , exception ) ;
log ( java . util . logging . Level . FINE , message , exception ) ;
}
}
public void warn ( Object message ) {
public void trace ( Object message ) {
log ( java . util . logging . Level . WARNING , message , null ) ;
log ( java . util . logging . Level . FINEST , message , null ) ;
}
}
public void warn ( Object message , Throwable exception ) {
public void trace ( Object message , Throwable exception ) {
log ( java . util . logging . Level . WARNING , message , exception ) ;
log ( java . util . logging . Level . FINEST , message , exception ) ;
}
}
private void log ( java . util . logging . Level level , Object message , Throwable exception ) {
private void log ( java . util . logging . Level level , Object message , Throwable exception ) {
if ( logger . isLoggable ( level ) ) {
if ( logger . isLoggable ( level ) ) {
LocationResolvingLogRecord rec = new LocationResolvingLogRecord ( level , String . valueOf ( message ) ) ;
LogRecord rec ;
rec . setLoggerName ( this . name ) ;
if ( message instanceof LogRecord ) {
rec . setResourceBundleName ( logger . getResourceBundleName ( ) ) ;
rec = ( LogRecord ) message ;
rec . setResourceBundle ( logger . getResourceBundle ( ) ) ;
}
rec . setThrown ( exception ) ;
else {
rec = new LocationResolvingLogRecord ( level , String . valueOf ( message ) ) ;
rec . setLoggerName ( this . name ) ;
rec . setResourceBundleName ( logger . getResourceBundleName ( ) ) ;
rec . setResourceBundle ( logger . getResourceBundle ( ) ) ;
rec . setThrown ( exception ) ;
}
logger . log ( rec ) ;
logger . log ( rec ) ;
}
}
}
}
@ -568,7 +597,7 @@ public abstract class LogFactory {
@SuppressWarnings ( "serial" )
@SuppressWarnings ( "serial" )
private static class LocationResolvingLogRecord extends java . util . logging . LogRecord {
private static class LocationResolvingLogRecord extends LogRecord {
private static final String FQCN = JavaUtilLog . class . getName ( ) ;
private static final String FQCN = JavaUtilLog . class . getName ( ) ;
@ -622,8 +651,9 @@ public abstract class LogFactory {
setSourceMethodName ( sourceMethodName ) ;
setSourceMethodName ( sourceMethodName ) ;
}
}
@SuppressWarnings ( "deprecation" ) // setMillis is deprecated in JDK 9
protected Object writeReplace ( ) {
protected Object writeReplace ( ) {
java . util . logging . LogRecord serialized = new java . util . logging . LogRecord ( getLevel ( ) , getMessage ( ) ) ;
LogRecord serialized = new LogRecord ( getLevel ( ) , getMessage ( ) ) ;
serialized . setLoggerName ( getLoggerName ( ) ) ;
serialized . setLoggerName ( getLoggerName ( ) ) ;
serialized . setResourceBundle ( getResourceBundle ( ) ) ;
serialized . setResourceBundle ( getResourceBundle ( ) ) ;
serialized . setResourceBundleName ( getResourceBundleName ( ) ) ;
serialized . setResourceBundleName ( getResourceBundleName ( ) ) ;