专栏首页码匠的流水账聊聊dubbo的LogbackContainer
原创

聊聊dubbo的LogbackContainer

本文主要研究一下dubbo的LogbackContainer

LogbackContainer

dubbo-2.7.2/dubbo-container/dubbo-container-logback/src/main/java/org/apache/dubbo/container/logback/LogbackContainer.java

public class LogbackContainer implements Container {
​
    public static final String LOGBACK_FILE = "dubbo.logback.file";
​
    public static final String LOGBACK_LEVEL = "dubbo.logback.level";
​
    public static final String LOGBACK_MAX_HISTORY = "dubbo.logback.maxhistory";
​
    public static final String DEFAULT_LOGBACK_LEVEL = "ERROR";
​
    @Override
    public void start() {
        String file = ConfigUtils.getProperty(LOGBACK_FILE);
        if (file != null && file.length() > 0) {
            String level = ConfigUtils.getProperty(LOGBACK_LEVEL);
            if (StringUtils.isEmpty(level)) {
                level = DEFAULT_LOGBACK_LEVEL;
            }
            // maxHistory=0 Infinite history
            int maxHistory = StringUtils.parseInteger(ConfigUtils.getProperty(LOGBACK_MAX_HISTORY));
​
            doInitializer(file, level, maxHistory);
        }
    }
​
    @Override
    public void stop() {
    }
​
    /**
     * Initializer logback
     *
     * @param file
     * @param level
     * @param maxHistory
     */
    private void doInitializer(String file, String level, int maxHistory) {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
        rootLogger.detachAndStopAllAppenders();
​
        // appender
        RollingFileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<ILoggingEvent>();
        fileAppender.setContext(loggerContext);
        fileAppender.setName("application");
        fileAppender.setFile(file);
        fileAppender.setAppend(true);
​
        // policy
        TimeBasedRollingPolicy<ILoggingEvent> policy = new TimeBasedRollingPolicy<ILoggingEvent>();
        policy.setContext(loggerContext);
        policy.setMaxHistory(maxHistory);
        policy.setFileNamePattern(file + ".%d{yyyy-MM-dd}");
        policy.setParent(fileAppender);
        policy.start();
        fileAppender.setRollingPolicy(policy);
​
        // encoder
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(loggerContext);
        encoder.setPattern("%date [%thread] %-5level %logger (%file:%line\\) - %msg%n");
        encoder.start();
        fileAppender.setEncoder(encoder);
​
        fileAppender.start();
​
        rootLogger.addAppender(fileAppender);
        rootLogger.setLevel(Level.toLevel(level));
        rootLogger.setAdditive(false);
    }
​
}
  • LogbackContainer实现了Container接口,其start方法判断是否有指定dubbo.logback.file,如果有则进一步获取dubbo.logback.level,如果为空则默认为ERROR级别,然后再获取dubbo.logback.maxhistory,最后调用doInitializer;doInitializer方法先获取rootLogger,然后执行detachAndStopAllAppenders,然后配置RollingFileAppender,并指定policy为TimeBasedRollingPolicy,并设置PatternLayoutEncoder,然后启动fileAppender,并添加到rootLogger中

实例

dubbo-2.7.2/dubbo-container/dubbo-container-logback/src/test/java/org/apache/dubbo/container/logback/LogbackContainerTest.java

public class LogbackContainerTest {
​
    private static final Logger logger = LoggerFactory.getLogger(LogbackContainerTest.class);
​
    @Test
    public void testContainer() {
        LogbackContainer container = (LogbackContainer) ExtensionLoader.getExtensionLoader(Container.class)
                .getExtension("logback");
        container.start();
​
        logger.debug("Test debug:" + this.getClass().getName());
        logger.warn("Test warn:" + this.getClass().getName());
        logger.info("Test info:" + this.getClass().getName());
        logger.error("Test error:" + this.getClass().getName());
​
        container.stop();
    }
​
}
  • 这里通过启动logback的container然后再使用logger输出进行验证

小结

LogbackContainer实现了Container接口,其start方法判断是否有指定dubbo.logback.file,如果有则进一步获取dubbo.logback.level,如果为空则默认为ERROR级别,然后再获取dubbo.logback.maxhistory,最后调用doInitializer;doInitializer方法先获取rootLogger,然后执行detachAndStopAllAppenders,然后配置RollingFileAppender,并指定policy为TimeBasedRollingPolicy,并设置PatternLayoutEncoder,然后启动fileAppender,并添加到rootLogger中

doc

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 何为内存溢出,何为内存泄露

    内存泄漏定义(memory leak):一个不再被程序使用的对象或变量还在内存中占有存储空间。

    Java架构
  • 微信小程序+商城信息管理系统

    a 会员管理 b 会员等级 c 收货地址管理d 会员优惠劵 e 会员收藏 f 会员足迹

    程序源代码
  • ArrayList 与 LinkedList 区别

    查看源码可以看到, RandomAccess 接口中什么都没有定义。所以,这就是个标识接口,标识那些实现了这个接口的类,具有随机访问的功能。

    happyJared
  • 详谈单例、饿汉、和懒汉模式

    私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。

    李红
  • Java并发机制的底层实现原理之volatile应用,初学者误看!

      Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制...

    爱撸猫的杰
  • 转角遇到爱_1,你不知道的Java

    一时无聊,在简书开一个文集,专门记录一些技术上的偏门知识,少用但有用的知识。也不知道该取什么名字,就叫转角遇到爱吧。

    大公爵
  • Java代码质量检查

    又搞一边质量扫描插件,之前做过一遍,然后后面各种忽略,然后就放弃了,所以,应该寻找一种方法,循序渐进的实施。本次将实施一个基本的打包扫描方案,包含

    Ryan-Miao
  • 图解 Java 垃圾回收机制,写得非常好!

    自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。

    美的让人心动
  • Android APK瘦身全面总结——如何从32.6M到13.6M

    之前我简单介绍了关于svg图片瘦身的问题,在公司,瘦身这个问题是我提出来的,所以这锅我背了。公司项目是32.6M,我给自己的要求就是低于20M。上周花了一个星期...

    Android技术干货分享
  • volatile 引用

    Java - Volatile reference object and its member fields visibility

    平凡的学生族

扫码关注云+社区

领取腾讯云代金券