Talk about dubbo’s LogbackContainer

  dubbo

Order

This article mainly studies dubbo’s 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 implements the Container interface. Its start method determines whether dubbo.logback.file is specified. If it is, it further obtains dubbo.logback.level If it is empty, it defaults to ERROR level, then obtains dubbo.logback.maxhistory, and finally calls doInitializer; . The doInitializer method first obtains the rootLogger, then executes detachAndStopAllAppenders, then configures the RollingFileAppender, specifies the policy as TimeBasedRollingPolicy, sets PatternLayoutEncoder, then starts fileAppender and adds it to the rootLogger

Example

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();
    }

}
  • This is verified by starting the container of logback and then using logger output.

Summary

LogbackContainer implements the Container interface. Its start method determines whether dubbo.logback.file is specified. If it is, it further obtains dubbo.logback.level If it is empty, it defaults to ERROR level, then obtains dubbo.logback.maxhistory, and finally calls doInitializer;. The doInitializer method first obtains the rootLogger, then executes detachAndStopAllAppenders, then configures the RollingFileAppender, specifies the policy as TimeBasedRollingPolicy, sets PatternLayoutEncoder, then starts fileAppender and adds it to the rootLogger

doc