mirror of
https://github.com/apache/struts.git
synced 2026-08-11 01:27:14 +00:00
Refactors logger factory to simplify adding new implementations
This commit is contained in:
@@ -17,10 +17,13 @@ package com.opensymphony.xwork2.util.logging;
|
||||
|
||||
import com.opensymphony.xwork2.XWorkConstants;
|
||||
import com.opensymphony.xwork2.XWorkException;
|
||||
import com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory;
|
||||
import com.opensymphony.xwork2.util.logging.jdk.JdkLoggerFactory;
|
||||
import com.opensymphony.xwork2.util.logging.log4j2.Log4j2LoggerFactory;
|
||||
import com.opensymphony.xwork2.util.logging.slf4j.Slf4jLoggerFactory;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.locks.ReadWriteLock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
|
||||
@@ -32,6 +35,14 @@ public abstract class LoggerFactory {
|
||||
private static final ReadWriteLock lock = new ReentrantReadWriteLock();
|
||||
private static LoggerFactory factory;
|
||||
|
||||
private static final List<LoggerClass> loggers = new LinkedList<LoggerClass>(){
|
||||
{
|
||||
add(new LoggerClass<CommonsLoggerFactory>("org.apache.commons.logging.LogFactory", CommonsLoggerFactory.class));
|
||||
add(new LoggerClass<Slf4jLoggerFactory>("org.slf4j.LoggerFactory", Slf4jLoggerFactory.class));
|
||||
add(new LoggerClass<Log4j2LoggerFactory>("org.apache.logging.log4j.LogManager", Log4j2LoggerFactory.class));
|
||||
}
|
||||
};
|
||||
|
||||
public static void setLoggerFactory(LoggerFactory factory) {
|
||||
lock.writeLock().lock();
|
||||
try {
|
||||
@@ -39,7 +50,6 @@ public abstract class LoggerFactory {
|
||||
} finally {
|
||||
lock.writeLock().unlock();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static Logger getLogger(Class<?> cls) {
|
||||
@@ -62,37 +72,7 @@ public abstract class LoggerFactory {
|
||||
lock.writeLock().lock();
|
||||
try {
|
||||
if (factory == null) {
|
||||
String userLoggerFactory = System.getProperty(XWorkConstants.XWORK_LOGGER_FACTORY);
|
||||
if (userLoggerFactory != null) {
|
||||
try {
|
||||
Class clazz = Class.forName(userLoggerFactory);
|
||||
factory = (LoggerFactory) clazz.newInstance();
|
||||
} catch (Exception e) {
|
||||
throw new XWorkException("System property [" + XWorkConstants.XWORK_LOGGER_FACTORY +
|
||||
"] was defined as [" + userLoggerFactory + "] but there is a problem to use that LoggerFactory!", e);
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
Class.forName("org.apache.commons.logging.LogFactory");
|
||||
factory = new com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory();
|
||||
} catch (ClassNotFoundException ex) {
|
||||
//commons-logging not found try slf4j LogFactory
|
||||
try {
|
||||
Class.forName("org.slf4j.LoggerFactory");
|
||||
factory = new Slf4jLoggerFactory();
|
||||
} catch (ClassNotFoundException cnfex) {
|
||||
// slf4j not found try if log4j2 is available in classpath
|
||||
try {
|
||||
Class.forName("org.apache.logging.log4j.LogManager");
|
||||
factory = new Log4j2LoggerFactory();
|
||||
} catch (ClassNotFoundException cnfex2) {
|
||||
// log4j2 not found, falling back to jdk logging
|
||||
factory = new JdkLoggerFactory();
|
||||
}
|
||||
factory = new JdkLoggerFactory();
|
||||
}
|
||||
}
|
||||
}
|
||||
createLoggerFactory();
|
||||
}
|
||||
return factory;
|
||||
} finally {
|
||||
@@ -100,8 +80,57 @@ public abstract class LoggerFactory {
|
||||
}
|
||||
}
|
||||
|
||||
private static void createLoggerFactory() {
|
||||
String userLoggerFactory = System.getProperty(XWorkConstants.XWORK_LOGGER_FACTORY);
|
||||
if (userLoggerFactory != null) {
|
||||
try {
|
||||
Class clazz = Class.forName(userLoggerFactory);
|
||||
factory = (LoggerFactory) clazz.newInstance();
|
||||
} catch (Exception e) {
|
||||
throw new XWorkException("System property [" + XWorkConstants.XWORK_LOGGER_FACTORY +
|
||||
"] was defined as [" + userLoggerFactory + "] but there is a problem to use that LoggerFactory!", e);
|
||||
}
|
||||
} else {
|
||||
factory = new JdkLoggerFactory();
|
||||
for (LoggerClass logger : loggers) {
|
||||
if (logger.isSupported()) {
|
||||
factory = logger.createInstance();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract Logger getLoggerImpl(Class<?> cls);
|
||||
|
||||
protected abstract Logger getLoggerImpl(String name);
|
||||
|
||||
private static class LoggerClass<T extends LoggerFactory> {
|
||||
|
||||
private final String loggerClazzName;
|
||||
private final Class<T> loggerImplClazz;
|
||||
|
||||
public LoggerClass(String loggerClazzName, Class<T> loggerImplClazz) {
|
||||
this.loggerClazzName = loggerClazzName;
|
||||
this.loggerImplClazz = loggerImplClazz;
|
||||
}
|
||||
|
||||
public boolean isSupported() {
|
||||
try {
|
||||
Class.forName(loggerClazzName);
|
||||
return true;
|
||||
} catch (ClassNotFoundException ignore) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public LoggerFactory createInstance() {
|
||||
try {
|
||||
return loggerImplClazz.newInstance();
|
||||
} catch (Exception e) {
|
||||
throw new XWorkException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user