利用JDK自带的Logger防止Log冲突

下面这个类默认使用JDK自带的logger,如系统存在org.apache.commons.logging则动态加载并用反射来调用,如进一步,系统中还存在Log4j及其配置,则自动使用Log4j代替commons logging, 这样程序包发布时根本无须将commons logging或log4j放在POM中。
package com.github.drinkjava2.jsqlbox;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * For log output
 * 
 * @author Yong Zhu
 * @version 1.0.0
 * @since 1.0.0
 */
public class SqlBoxLogger {
	private Object commonLogger;
	private Method commonLoggerInfoMethod;
	private Method commonLoggerErrorMethod;
	private Logger jdkLogger;

	public SqlBoxLogger(Class<?> targetClass) {
		if (targetClass == null)
			throw new AssertionError("SqlBoxLogger error: targetClass can not be null.");
		try {
			Class<?> logFactoryClass = Class.forName("org.apache.commons.logging.LogFactory");
			Method method = logFactoryClass.getMethod("getLog", new Class[] { Class.class });
			commonLogger = method.invoke(logFactoryClass, new Object[] { targetClass });
			commonLoggerInfoMethod = commonLogger.getClass().getMethod("info", new Class[] { Object.class });
			commonLoggerErrorMethod = commonLogger.getClass().getMethod("error", new Class[] { Object.class });
		} catch (Exception e) {
			SqlBoxException.eatException(e);
		}
		if (commonLogger == null)
			jdkLogger = Logger.getLogger(targetClass.getName());

	}

	public static SqlBoxLogger getLog(Class<?> targetClass) {
		return new SqlBoxLogger(targetClass);
	}

	public void info(String msg) {
		if (jdkLogger != null) {
			jdkLogger.log(Level.INFO, msg);
			return;
		}
		try {
			commonLoggerInfoMethod.invoke(commonLogger, new Object[] { msg });
		} catch (Exception e) {
			throw new AssertionError(e.getMessage());
		}
	}

	public void error(String msg) {
		if (jdkLogger != null) {
			jdkLogger.log(Level.WARNING, msg);
			return;
		}
		try {
			commonLoggerErrorMethod.invoke(commonLogger, new Object[] { msg });
		} catch (Exception e) {
			throw new AssertionError(e.getMessage());
		}
	}

}

猜你喜欢

转载自drinkjava2.iteye.com/blog/2341636