metaswirl commented on code in PR #19272: URL: https://github.com/apache/flink/pull/19272#discussion_r841673414
########## flink-test-utils-parent/flink-test-utils-junit/src/main/java/org/apache/flink/testutils/logging/TestLoggerResource.java: ########## @@ -43,52 +52,125 @@ private final String loggerName; private final org.slf4j.event.Level level; + @Nullable private LoggerConfig backupLoggerConfig = null; private ConcurrentLinkedQueue<String> loggingEvents; public TestLoggerResource(Class<?> clazz, org.slf4j.event.Level level) { - this.loggerName = clazz.getCanonicalName(); + this(clazz.getCanonicalName(), level); + } + + private TestLoggerResource(String loggerName, org.slf4j.event.Level level) { + this.loggerName = loggerName; this.level = level; } public List<String> getMessages() { return new ArrayList<>(loggingEvents); } + private static String generateRandomString() { + return UUID.randomUUID().toString().replace("-", ""); + } + @Override protected void before() throws Throwable { loggingEvents = new ConcurrentLinkedQueue<>(); + final LoggerConfig previousLoggerConfig = + LOGGER_CONTEXT.getConfiguration().getLoggerConfig(loggerName); + + final Level previousLevel = previousLoggerConfig.getLevel(); + final Level userDefinedLevel = Level.getLevel(level.name()); + + // Set log level to last specific. This ensures that the parent still receives all log + // lines. + // WARN is more specific than INFO is more specific than DEBUG etc. + final Level newLevel = + userDefinedLevel.isMoreSpecificThan(previousLevel) + ? previousLevel + : userDefinedLevel; + + // Filter log lines according to user requirements. + final Filter levelFilter = + ThresholdFilter.createFilter( + userDefinedLevel, Filter.Result.ACCEPT, Filter.Result.DENY); + Appender testAppender = - new AbstractAppender("test-appender", null, null, false) { + new AbstractAppender( + "test-appender-" + generateRandomString(), levelFilter, null, false) { @Override public void append(LogEvent event) { loggingEvents.add(event.getMessage().getFormattedMessage()); } }; testAppender.start(); - AppenderRef appenderRef = AppenderRef.createAppenderRef(testAppender.getName(), null, null); - LoggerConfig logger = + LoggerConfig loggerConfig = LoggerConfig.createLogger( - false, - Level.getLevel(level.name()), - "test", + true, + newLevel, + loggerName, null, - new AppenderRef[] {appenderRef}, + new AppenderRef[] {}, null, LOGGER_CONTEXT.getConfiguration(), null); - logger.addAppender(testAppender, null, null); + loggerConfig.addAppender(testAppender, null, null); - LOGGER_CONTEXT.getConfiguration().addLogger(loggerName, logger); + if (previousLoggerConfig.getName().equals(loggerName)) { + // remove the previous logger config for the duration of the test + backupLoggerConfig = previousLoggerConfig; + LOGGER_CONTEXT.getConfiguration().removeLogger(loggerName); + + // combine appender set + // Note: The appender may still receive more or less messages depending on the log level + // difference between the two logger + for (Appender appender : previousLoggerConfig.getAppenders().values()) { + loggerConfig.addAppender(appender, null, null); + } + } + + LOGGER_CONTEXT.getConfiguration().addLogger(loggerName, loggerConfig); LOGGER_CONTEXT.updateLoggers(); } @Override protected void after() { LOGGER_CONTEXT.getConfiguration().removeLogger(loggerName); + if (backupLoggerConfig != null) { Review Comment: A very good point -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@flink.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org