首页 > 其他 > 详细

类加载器隔离朴实案例(二)logback

时间:2020-03-27 18:56:27      阅读:88      评论:0      收藏:0      [点我收藏+]

背景:与(一)相同,避免主项目pom中众多log jar包冲突(比如:java日志组件的关系 slf4j logback log4j ),套路还是一样

现成的代码继承:load/find class 与 forname 在static代码块加载的不同 (二)非系统类jdbc 

 

     static {
        try {
            InputStream inputStream2 = JdbcDriverClassLoader.class.getClassLoader().getResourceAsStream("jdbcdriver/ojdbc6-11.2.0.3.resource");
            InputStream inputStreamSlf4jApi = JdbcDriverClassLoader.class.getClassLoader().getResourceAsStream("log/slf4j-api-1.7.25.resource");
            InputStream inputStreamLogbackCore = JdbcDriverClassLoader.class.getClassLoader().getResourceAsStream("log/logback-core-1.2.3.resource");
            InputStream inputStreamLogbackClassic = JdbcDriverClassLoader.class.getClassLoader().getResourceAsStream("log/logback-classic-1.2.3.resource");
            jdbcDriverClassLoader = new JdbcDriverClassLoader(new JarInputStream[]{new JarInputStream(inputStream2),
                    new JarInputStream(inputStreamSlf4jApi),
                    new JarInputStream(inputStreamLogbackCore),
                    new JarInputStream(inputStreamLogbackClassic)});
            jdbcDriverClassLoader.configureLogback();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



public void configureLogback() throws Exception {
        Class clLoggerFactory = loadClass("org.slf4j.LoggerFactory");
        Method getILoggerFactory = clLoggerFactory.getMethod("getILoggerFactory");
        Object loggerContext = getILoggerFactory.invoke(null);
        Class clLoggerContext = loadClass("ch.qos.logback.classic.LoggerContext");
        Method method = clLoggerContext.getMethod("reset");
        method.invoke(loggerContext);

        Class clJoranConfigurator = loadClass("ch.qos.logback.classic.joran.JoranConfigurator");
        Object configurator = clJoranConfigurator.newInstance();

        URL url = this.getClass().getClassLoader().getResource("xxx-logback.xml");
        method = clJoranConfigurator.getMethod("setContext", loadClass("ch.qos.logback.core.Context"));
        method.invoke(configurator, loggerContext);
        method = clJoranConfigurator.getMethod("doConfigure", URL.class);
        method.invoke(configurator, url);
    }

  

import java.lang.reflect.Method;

public class MyLogbackFactory {

    public static MyLogger getLogger(Class c) {
        try {
            Class cl = JdbcDriverClassLoader.getJdbcDriverClassLoader().loadClass("org.slf4j.LoggerFactory");
            Method method = cl.getMethod("getLogger", Class.class);
            Object log = method.invoke(null, c);

            ScefLogger scefLogger = new ScefLogger();
            scefLogger.setLogger(log);
            return scefLogger;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static class ScefLogger {
        public Object getLogger() {
            return logger;
        }

        public void setLogger(Object logger) {
            this.logger = logger;
        }

        Object logger;

        public void info(String var1) {
            try {
                Class logcl = JdbcDriverClassLoader.getJdbcDriverClassLoader().loadClass("org.slf4j.Logger");
                Method info = logcl.getMethod("info", String.class);
                info.invoke(this.logger, var1);
            } catch (Exception e) {
                throw new RuntimeException(e) ;
            }
        }

        public void info(String var1, Object... var2) {
            try {
                Class logcl = JdbcDriverClassLoader.getJdbcDriverClassLoader().loadClass("org.slf4j.Logger");
                Method info = logcl.getMethod("info", String.class, new Object[0].getClass());
                info.invoke(this.logger, var1, var2);
            } catch (Exception e) {
                throw new RuntimeException(e) ;
            }
        }

        public void debug(String var1, Object... var2) {
            try {
                Class logcl = JdbcDriverClassLoader.getJdbcDriverClassLoader().loadClass("org.slf4j.Logger");
                Method info = logcl.getMethod("debug", String.class, new Object[0].getClass());
                info.invoke(this.logger, var1, var2);
            } catch (Exception e) {
                throw new RuntimeException(e) ;
            }
        }

        public void debug(String var1) {
            try {
                Class logcl = JdbcDriverClassLoader.getJdbcDriverClassLoader().loadClass("org.slf4j.Logger");
                Method info = logcl.getMethod("debug", String.class);
                info.invoke(this.logger, var1);
            } catch (Exception e) {
                throw new RuntimeException(e) ;
            }
        }

        public void warn(String var1, Object... var2) {
            try {
                Class logcl = JdbcDriverClassLoader.getJdbcDriverClassLoader().loadClass("org.slf4j.Logger");
                Method info = logcl.getMethod("warn", String.class, new Object[0].getClass());
                info.invoke(this.logger, var1, var2);
            } catch (Exception e) {
                throw new RuntimeException(e) ;
            }
        }

        public void warn(String var1) {
            try {
                Class logcl = JdbcDriverClassLoader.getJdbcDriverClassLoader().loadClass("org.slf4j.Logger");
                Method info = logcl.getMethod("warn", String.class);
                info.invoke(this.logger, var1);
            } catch (Exception e) {
                throw new RuntimeException(e) ;
            }
        }

        public void error(String var1, Object... var2) {
            try {
                Class logcl = JdbcDriverClassLoader.getJdbcDriverClassLoader().loadClass("org.slf4j.Logger");
                Method info = logcl.getMethod("error", String.class, new Object[0].getClass());
                info.invoke(this.logger, var1, var2);
            } catch (Exception e) {
                throw new RuntimeException(e) ;
            }
        }

        public void error(String var1) {
            try {
                Class logcl = JdbcDriverClassLoader.getJdbcDriverClassLoader().loadClass("org.slf4j.Logger");
                Method info = logcl.getMethod("error", String.class);
                info.invoke(this.logger, var1);
            } catch (Exception e) {
                throw new RuntimeException(e) ;
            }
        }
    }
}

  

private static final MyLogbackFactory.MyLogger logger = ScefLogbackFactory.getLogger(xxx.class);

logger.info("create");
            logger.info("create {}  df {} {}", "xx", "xx", "xx");

  

类加载器隔离朴实案例(二)logback

原文:https://www.cnblogs.com/silyvin/p/12582740.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!