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