Prefer SLF4J SPI over Log4J in case of log4j-to-slf4j bridge
Issue: SPR-17586
This commit is contained in:
parent
73a96c5152
commit
4b4503085a
|
|
@ -36,31 +36,41 @@ import org.slf4j.spi.LocationAwareLogger;
|
||||||
*/
|
*/
|
||||||
final class LogAdapter {
|
final class LogAdapter {
|
||||||
|
|
||||||
private static LogApi logApi = LogApi.JUL;
|
private static final String LOG4J_SPI = "org.apache.logging.log4j.spi.ExtendedLogger";
|
||||||
|
|
||||||
|
private static final String LOG4J_SLF4J_PROVIDER = "org.apache.logging.slf4j.SLF4JProvider";
|
||||||
|
|
||||||
|
private static final String SLF4J_SPI = "org.slf4j.spi.LocationAwareLogger";
|
||||||
|
|
||||||
|
private static final String SLF4J_API = "org.slf4j.Logger";
|
||||||
|
|
||||||
|
|
||||||
|
private static final LogApi logApi;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
ClassLoader cl = LogAdapter.class.getClassLoader();
|
if (isPresent(LOG4J_SPI)) {
|
||||||
try {
|
if (isPresent(LOG4J_SLF4J_PROVIDER) && isPresent(SLF4J_SPI)) {
|
||||||
// Try Log4j 2.x API
|
// log4j-to-slf4j bridge -> we'll rather go with the SLF4J SPI;
|
||||||
Class.forName("org.apache.logging.log4j.spi.ExtendedLogger", false, cl);
|
// however, we still prefer Log4j over the plain SLF4J API since
|
||||||
logApi = LogApi.LOG4J;
|
// the latter does not have location awareness support.
|
||||||
}
|
|
||||||
catch (ClassNotFoundException ex1) {
|
|
||||||
try {
|
|
||||||
// Try SLF4J 1.7 SPI
|
|
||||||
Class.forName("org.slf4j.spi.LocationAwareLogger", false, cl);
|
|
||||||
logApi = LogApi.SLF4J_LAL;
|
logApi = LogApi.SLF4J_LAL;
|
||||||
}
|
}
|
||||||
catch (ClassNotFoundException ex2) {
|
else {
|
||||||
try {
|
// Use Log4j 2.x directly, including location awareness support
|
||||||
// Try SLF4J 1.7 API
|
logApi = LogApi.LOG4J;
|
||||||
Class.forName("org.slf4j.Logger", false, cl);
|
}
|
||||||
|
}
|
||||||
|
else if (isPresent(SLF4J_SPI)) {
|
||||||
|
// Full SLF4J SPI including location awareness support
|
||||||
|
logApi = LogApi.SLF4J_LAL;
|
||||||
|
}
|
||||||
|
else if (isPresent(SLF4J_API)) {
|
||||||
|
// Minimal SLF4J API without location awareness support
|
||||||
logApi = LogApi.SLF4J;
|
logApi = LogApi.SLF4J;
|
||||||
}
|
}
|
||||||
catch (ClassNotFoundException ex3) {
|
else {
|
||||||
// Keep java.util.logging as default
|
// java.util.logging as default
|
||||||
}
|
logApi = LogApi.JUL;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -92,6 +102,16 @@ final class LogAdapter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isPresent(String className) {
|
||||||
|
try {
|
||||||
|
Class.forName(className, false, LogAdapter.class.getClassLoader());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (ClassNotFoundException ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private enum LogApi {LOG4J, SLF4J_LAL, SLF4J, JUL}
|
private enum LogApi {LOG4J, SLF4J_LAL, SLF4J, JUL}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue