利用JDK自带的Logger防止Log冲突
程序员文章站
2022-07-13 12:34:14
...
下面这个类默认使用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()); } } }