This is an automated email from the ASF dual-hosted git repository. dsoumis pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit dab5346912fc98042cb7a4497b44ca272ddcd11f Author: Dimitris Soumis <jimsou...@gmail.com> AuthorDate: Thu Sep 4 16:02:08 2025 +0300 Add generic LogCapture for global logs --- .../apache/catalina/startup/TomcatBaseTest.java | 96 +++++++++++++--------- 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/test/org/apache/catalina/startup/TomcatBaseTest.java b/test/org/apache/catalina/startup/TomcatBaseTest.java index c3aabf28d8..d4f440f120 100644 --- a/test/org/apache/catalina/startup/TomcatBaseTest.java +++ b/test/org/apache/catalina/startup/TomcatBaseTest.java @@ -38,7 +38,6 @@ import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; @@ -940,18 +939,14 @@ public abstract class TomcatBaseTest extends LoggingBaseTest { } /** - * Captures webapp-scoped logs (e.g. ContextConfig/Digester) during the - * CONFIGURE_START phase of a {@link Context}. + * Captures logs for the given logger names in the current ClassLoader. */ - public static class WebappLogCapture implements LifecycleListener, AutoCloseable { - private final Level level; - private final String[] loggerNames; - private final List<LogRecord> logRecords = Collections.synchronizedList(new ArrayList<>()); - private final Map<Logger, Level> previousLevelsOfLoggersMap = new IdentityHashMap<>(); - private final List<Logger> attachedLoggers = new CopyOnWriteArrayList<>(); - private volatile boolean installed = false; - - private final Handler handler = new Handler() { + public static class LogCapture implements AutoCloseable { + protected final Level level; + protected final String[] loggerNames; + protected final List<LogRecord> logRecords = Collections.synchronizedList(new ArrayList<>()); + protected final Map<Logger, Level> previousLevelsOfLoggersMap = new IdentityHashMap<>(); + protected final Handler handler = new Handler() { @Override public void publish(LogRecord record) { logRecords.add(record); @@ -966,38 +961,17 @@ public abstract class TomcatBaseTest extends LoggingBaseTest { logRecords.clear(); } }; - public WebappLogCapture(Level level, String... loggerNames) { - this.level = level == null ? Level.ALL : level; + public LogCapture(Level level, String... loggerNames) { + this.level = (level == null ? Level.ALL : level); this.loggerNames = loggerNames; } - @Override - public void close() throws Exception { - for (Logger l : attachedLoggers) { - try { - l.removeHandler(handler); - } catch (Throwable ignore) { - } - try { - l.setLevel(previousLevelsOfLoggersMap.get(l)); - } catch (Throwable ignore) { - } - } - attachedLoggers.clear(); - previousLevelsOfLoggersMap.clear(); - } - - @Override - public void lifecycleEvent(LifecycleEvent event) { - if (Lifecycle.CONFIGURE_START_EVENT.equals(event.getType()) && !installed) { - installed = true; - for (String name : loggerNames) { - Logger logger = Logger.getLogger(name); - previousLevelsOfLoggersMap.put(logger, logger.getLevel()); - logger.addHandler(handler); - logger.setLevel(level); - attachedLoggers.add(logger); - } + public void attach() { + for (String name : loggerNames) { + Logger logger = Logger.getLogger(name); + previousLevelsOfLoggersMap.put(logger, logger.getLevel()); + logger.addHandler(handler); + logger.setLevel(level); } } @@ -1019,6 +993,46 @@ public abstract class TomcatBaseTest extends LoggingBaseTest { } return false; } + + @Override + public void close() throws Exception { + for (Logger l : previousLevelsOfLoggersMap.keySet()) { + try { + l.removeHandler(handler); + } catch (Throwable ignore) { + } + try { + l.setLevel(previousLevelsOfLoggersMap.get(l)); + } catch (Throwable ignore) { + } + } + previousLevelsOfLoggersMap.clear(); + } + } + + public static LogCapture attachLogCapture(Level level, String... loggerNames) { + LogCapture logCapture = new LogCapture(level, loggerNames); + logCapture.attach(); + return logCapture; + } + + /** + * Captures webapp-scoped logs (e.g. ContextConfig/Digester) during the + * CONFIGURE_START phase of a {@link Context}. + */ + public static class WebappLogCapture extends LogCapture implements LifecycleListener { + private volatile boolean installed = false; + public WebappLogCapture(Level level, String... loggerNames) { + super(level, loggerNames); + } + + @Override + public void lifecycleEvent(LifecycleEvent event) { + if (Lifecycle.CONFIGURE_START_EVENT.equals(event.getType()) && !installed) { + installed = true; + this.attach(); + } + } } /** --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org