From 3865a1308fc5bc229a090c35e09e83e7ec42f60f Mon Sep 17 00:00:00 2001 From: Krystian Panek Date: Tue, 10 Mar 2026 11:22:44 +0100 Subject: [PATCH 1/5] Log appender hardening --- .../core/code/log/LogInterceptorManager.java | 9 -- .../core/code/log/LogbackAppenderFactory.java | 70 ++++++++--- .../core/code/log/LogbackLogInterceptor.java | 67 ++++++++++ .../core/code/log/SlingLogInterceptor.java | 114 ------------------ 4 files changed, 121 insertions(+), 139 deletions(-) create mode 100644 core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java delete mode 100644 core/src/main/java/dev/vml/es/acm/core/code/log/SlingLogInterceptor.java diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java index 28987914..d1f01511 100644 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java @@ -7,15 +7,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** - * Selects the best available {@link LogInterceptor} implementation. - * - *

Why not OSGi Log Service 1.4? Its {@code LogReaderService} only captures - * logs sent directly to OSGi Log Service. SLF4J/Logback logs are bridged one-way (SLF4J → OSGi), - * so {@code LogReaderService} doesn't receive them. We use Sling AppenderTracker instead.

- * - * @see SlingLogInterceptor - */ @Component(service = LogInterceptorManager.class) public class LogInterceptorManager { diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java index 8f2dcf6b..c1906848 100644 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java @@ -6,13 +6,10 @@ import java.util.List; import java.util.function.Consumer; -/** - * Creates Logback Appender proxies via reflection, avoiding compile-time dependency on ch.qos.logback.*. - */ class LogbackAppenderFactory { - static final String LOGBACK_LOGGER_CONTEXT = "ch.qos.logback.classic.LoggerContext"; - static final String LOGBACK_APPENDER = "ch.qos.logback.core.Appender"; + private static final String LOGBACK_LOGGER_CONTEXT = "ch.qos.logback.classic.LoggerContext"; + private static final String LOGBACK_APPENDER = "ch.qos.logback.core.Appender"; private static final String LOGBACK_CONTEXT = "ch.qos.logback.core.Context"; private static final String LOGBACK_LOGGING_EVENT = "ch.qos.logback.classic.spi.ILoggingEvent"; @@ -22,7 +19,34 @@ class LogbackAppenderFactory { this.classLoader = classLoader; } - Object createAppender(String name, Consumer listener, List loggerNames) + boolean isAvailable() { + try { + classLoader.loadClass(LOGBACK_LOGGER_CONTEXT); + classLoader.loadClass(LOGBACK_APPENDER); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + Object attach(String name, Consumer listener, List loggerNames) + throws ReflectiveOperationException { + Object appender = createAppender(name, listener, loggerNames); + initAppender(appender); + for (String loggerName : loggerNames) { + addAppenderToLogger(appender, loggerName); + } + return appender; + } + + void detach(Object appender, List loggerNames) throws ReflectiveOperationException { + for (String loggerName : loggerNames) { + detachAppenderFromLogger(appender, loggerName); + } + stopAppender(appender); + } + + private Object createAppender(String name, Consumer listener, List loggerNames) throws ClassNotFoundException { Class appenderClass = classLoader.loadClass(LOGBACK_APPENDER); Class eventClass = classLoader.loadClass(LOGBACK_LOGGING_EVENT); @@ -32,7 +56,18 @@ Object createAppender(String name, Consumer listener, List l new AppenderHandler(name, eventClass, listener, loggerNames)); } - Object getLoggerContext() throws ClassNotFoundException { + private void initAppender(Object appender) throws ReflectiveOperationException { + Object loggerContext = getLoggerContext(); + Class ctxClass = classLoader.loadClass(LOGBACK_CONTEXT); + appender.getClass().getMethod("setContext", ctxClass).invoke(appender, loggerContext); + appender.getClass().getMethod("start").invoke(appender); + } + + private void stopAppender(Object appender) throws ReflectiveOperationException { + appender.getClass().getMethod("stop").invoke(appender); + } + + private Object getLoggerContext() throws ClassNotFoundException { Class ctxClass = classLoader.loadClass(LOGBACK_LOGGER_CONTEXT); Object ctx = org.slf4j.LoggerFactory.getILoggerFactory(); if (ctx == null || !ctxClass.isInstance(ctx)) { @@ -41,17 +76,20 @@ Object getLoggerContext() throws ClassNotFoundException { return ctx; } - void setContext(Object appender, Object context) throws ReflectiveOperationException { - Class ctxClass = classLoader.loadClass(LOGBACK_CONTEXT); - appender.getClass().getMethod("setContext", ctxClass).invoke(appender, context); - } - - void start(Object appender) throws ReflectiveOperationException { - appender.getClass().getMethod("start").invoke(appender); + private void addAppenderToLogger(Object appender, String loggerName) throws ReflectiveOperationException { + Object loggerContext = getLoggerContext(); + Class loggerContextClass = classLoader.loadClass(LOGBACK_LOGGER_CONTEXT); + Object logger = loggerContextClass.getMethod("getLogger", String.class).invoke(loggerContext, loggerName); + Class appenderClass = classLoader.loadClass(LOGBACK_APPENDER); + logger.getClass().getMethod("addAppender", appenderClass).invoke(logger, appender); } - void stop(Object appender) throws ReflectiveOperationException { - appender.getClass().getMethod("stop").invoke(appender); + private void detachAppenderFromLogger(Object appender, String loggerName) throws ReflectiveOperationException { + Object loggerContext = getLoggerContext(); + Class loggerContextClass = classLoader.loadClass(LOGBACK_LOGGER_CONTEXT); + Object logger = loggerContextClass.getMethod("getLogger", String.class).invoke(loggerContext, loggerName); + Class appenderClass = classLoader.loadClass(LOGBACK_APPENDER); + logger.getClass().getMethod("detachAppender", appenderClass).invoke(logger, appender); } private static class AppenderHandler implements InvocationHandler { diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java new file mode 100644 index 00000000..b5ea83f2 --- /dev/null +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java @@ -0,0 +1,67 @@ +package dev.vml.es.acm.core.code.log; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; +import org.apache.sling.commons.classloader.DynamicClassLoaderManager; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Component(service = LogInterceptor.class) +public class LogbackLogInterceptor implements LogInterceptor { + + private static final Logger LOG = LoggerFactory.getLogger(LogbackLogInterceptor.class); + + private static final String APPENDER_NAME = "ACM-LogbackLogInterceptor"; + + @Reference + private DynamicClassLoaderManager classLoaderManager; + + @Override + public boolean isAvailable() { + if (classLoaderManager == null) { + return false; + } + try { + ClassLoader cl = classLoaderManager.getDynamicClassLoader(); + if (cl == null) { + return false; + } + return new LogbackAppenderFactory(cl).isAvailable(); + } catch (Exception e) { + LOG.debug("Cannot check log interceptor availability", e); + return false; + } + } + + @Override + public Handle attach(Consumer listener, String... loggerNames) { + if (listener == null || loggerNames == null || loggerNames.length == 0) { + LOG.warn("Cannot attach - invalid parameters"); + return () -> {}; + } + if (!isAvailable()) { + LOG.warn("Log interceptor not available"); + return () -> {}; + } + try { + LogbackAppenderFactory factory = new LogbackAppenderFactory(classLoaderManager.getDynamicClassLoader()); + List loggerList = Arrays.asList(loggerNames); + Object appender = factory.attach(APPENDER_NAME, listener, loggerList); + LOG.debug("Attached appender to loggers: {}", loggerList); + + return () -> { + try { + factory.detach(appender, loggerList); + } catch (Exception e) { + LOG.debug("Failed to detach appender", e); + } + }; + } catch (Exception e) { + LOG.error("Failed to attach log interceptor", e); + return () -> {}; + } + } +} diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/SlingLogInterceptor.java b/core/src/main/java/dev/vml/es/acm/core/code/log/SlingLogInterceptor.java deleted file mode 100644 index c2d5e700..00000000 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/SlingLogInterceptor.java +++ /dev/null @@ -1,114 +0,0 @@ -package dev.vml.es.acm.core.code.log; - -import java.util.Arrays; -import java.util.Dictionary; -import java.util.Hashtable; -import java.util.List; -import java.util.function.Consumer; -import org.apache.sling.commons.classloader.DynamicClassLoaderManager; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Hooks into Sling Commons Log via AppenderTracker — registers Appender as OSGi service. - * - *

Uses reflection to avoid compile-time Logback dependencies (Cloud Manager scanner compatible). - * Relies on internal Sling API, but stable since AEM 6.5.0 — the most pragmatic solution for - * log interception across all supported AEM versions.

- * - * @see Sling Logging - * @see AppenderTracker - */ -@Component(service = LogInterceptor.class) -public class SlingLogInterceptor implements LogInterceptor { - - private static final Logger LOG = LoggerFactory.getLogger(SlingLogInterceptor.class); - - private static final String APPENDER_NAME = "ACM-SlingLogInterceptor"; - - private static final String PROP_LOGGERS = "loggers"; - - @Reference - private DynamicClassLoaderManager classLoaderManager; - - private BundleContext bundleContext; - - @Activate - protected void activate(BundleContext bundleContext) { - this.bundleContext = bundleContext; - } - - @Override - public boolean isAvailable() { - if (classLoaderManager == null || bundleContext == null) { - return false; - } - try { - ClassLoader cl = classLoaderManager.getDynamicClassLoader(); - if (cl == null) { - return false; - } - cl.loadClass(LogbackAppenderFactory.LOGBACK_LOGGER_CONTEXT); - cl.loadClass(LogbackAppenderFactory.LOGBACK_APPENDER); - return true; - } catch (ClassNotFoundException e) { - return false; - } catch (Exception e) { - LOG.debug("Cannot check Sling log interceptor availability", e); - return false; - } - } - - @Override - public Handle attach(Consumer listener, String... loggerNames) { - if (listener == null || loggerNames == null || loggerNames.length == 0) { - LOG.warn("Cannot attach - invalid parameters"); - return () -> {}; - } - if (!isAvailable()) { - LOG.warn("Sling log interceptor not available"); - return () -> {}; - } - try { - return doAttach(listener, loggerNames); - } catch (Exception e) { - LOG.error("Failed to attach Sling log interceptor", e); - return () -> {}; - } - } - - private Handle doAttach(Consumer listener, String[] loggerNames) throws Exception { - LogbackAppenderFactory factory = new LogbackAppenderFactory(classLoaderManager.getDynamicClassLoader()); - List loggerList = Arrays.asList(loggerNames); - Object appender = factory.createAppender(APPENDER_NAME, listener, loggerList); - - factory.setContext(appender, factory.getLoggerContext()); - factory.start(appender); - - Dictionary props = new Hashtable<>(); - props.put(PROP_LOGGERS, loggerNames); - - @SuppressWarnings("rawtypes") - ServiceRegistration reg = - bundleContext.registerService(LogbackAppenderFactory.LOGBACK_APPENDER, appender, props); - LOG.debug("Registered for loggers: {}", loggerList); - - return () -> { - try { - if (reg.getReference() != null) { - reg.unregister(); - } - factory.stop(appender); - } catch (IllegalStateException e) { - LOG.debug("Already unregistered", e); - } catch (Exception e) { - LOG.warn("Failed to unregister", e); - } - }; - } -} From 767ab38a181369a8f48615d715efec5d395d67a4 Mon Sep 17 00:00:00 2001 From: Krystian Panek Date: Tue, 10 Mar 2026 12:44:13 +0100 Subject: [PATCH 2/5] Hardening --- .../core/code/log/LogInterceptorManager.java | 2 +- .../core/code/log/LogbackAppenderFactory.java | 44 +++++++++++++++---- .../core/code/log/LogbackLogInterceptor.java | 44 +++++++++---------- 3 files changed, 57 insertions(+), 33 deletions(-) diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java index d1f01511..166fd1ee 100644 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java @@ -35,7 +35,7 @@ public LogInterceptor.Handle attach(Consumer listener, String... log return i.attach(listener, loggerNames); }) .orElseGet(() -> { - LOG.warn("No log interceptor available"); + LOG.debug("No log interceptor available"); return () -> {}; }); } diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java index c1906848..bec7441b 100644 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java @@ -3,11 +3,16 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class LogbackAppenderFactory { + private static final Logger LOG = LoggerFactory.getLogger(LogbackAppenderFactory.class); + private static final String LOGBACK_LOGGER_CONTEXT = "ch.qos.logback.classic.LoggerContext"; private static final String LOGBACK_APPENDER = "ch.qos.logback.core.Appender"; private static final String LOGBACK_CONTEXT = "ch.qos.logback.core.Context"; @@ -32,18 +37,41 @@ boolean isAvailable() { Object attach(String name, Consumer listener, List loggerNames) throws ReflectiveOperationException { Object appender = createAppender(name, listener, loggerNames); - initAppender(appender); - for (String loggerName : loggerNames) { - addAppenderToLogger(appender, loggerName); + List attached = new ArrayList<>(); + try { + initAppender(appender); + for (String loggerName : loggerNames) { + addAppenderToLogger(appender, loggerName); + attached.add(loggerName); + } + return appender; + } catch (ReflectiveOperationException e) { + detach(appender, attached); + throw e; } - return appender; } - void detach(Object appender, List loggerNames) throws ReflectiveOperationException { - for (String loggerName : loggerNames) { - detachAppenderFromLogger(appender, loggerName); + void detach(Object appender, List loggerNames) { + if (appender == null) { + return; + } + try { + if (loggerNames != null) { + for (String loggerName : loggerNames) { + try { + detachAppenderFromLogger(appender, loggerName); + } catch (Exception e) { + LOG.warn("Failed to detach appender from logger '{}'", loggerName, e); + } + } + } + } finally { + try { + stopAppender(appender); + } catch (Exception e) { + LOG.warn("Failed to stop appender", e); + } } - stopAppender(appender); } private Object createAppender(String name, Consumer listener, List loggerNames) diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java index b5ea83f2..ba5487ef 100644 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java @@ -21,19 +21,7 @@ public class LogbackLogInterceptor implements LogInterceptor { @Override public boolean isAvailable() { - if (classLoaderManager == null) { - return false; - } - try { - ClassLoader cl = classLoaderManager.getDynamicClassLoader(); - if (cl == null) { - return false; - } - return new LogbackAppenderFactory(cl).isAvailable(); - } catch (Exception e) { - LOG.debug("Cannot check log interceptor availability", e); - return false; - } + return getFactory() != null; } @Override @@ -42,26 +30,34 @@ public Handle attach(Consumer listener, String... loggerNames) { LOG.warn("Cannot attach - invalid parameters"); return () -> {}; } - if (!isAvailable()) { - LOG.warn("Log interceptor not available"); + LogbackAppenderFactory factory = getFactory(); + if (factory == null) { return () -> {}; } try { - LogbackAppenderFactory factory = new LogbackAppenderFactory(classLoaderManager.getDynamicClassLoader()); List loggerList = Arrays.asList(loggerNames); Object appender = factory.attach(APPENDER_NAME, listener, loggerList); LOG.debug("Attached appender to loggers: {}", loggerList); - - return () -> { - try { - factory.detach(appender, loggerList); - } catch (Exception e) { - LOG.debug("Failed to detach appender", e); - } - }; + return () -> factory.detach(appender, loggerList); } catch (Exception e) { LOG.error("Failed to attach log interceptor", e); return () -> {}; } } + + private LogbackAppenderFactory getFactory() { + if (classLoaderManager == null) { + return null; + } + try { + ClassLoader cl = classLoaderManager.getDynamicClassLoader(); + if (cl == null) { + return null; + } + LogbackAppenderFactory factory = new LogbackAppenderFactory(cl); + return factory.isAvailable() ? factory : null; + } catch (Exception e) { + return null; + } + } } From 3b1209d73517b75a380e3b3562fedc23c6883cde Mon Sep 17 00:00:00 2001 From: Krystian Panek Date: Tue, 10 Mar 2026 13:38:12 +0100 Subject: [PATCH 3/5] Logback hardening --- .../core/code/log/LogbackAppenderFactory.java | 53 ++++++++----------- .../core/code/log/LogbackLogInterceptor.java | 3 +- 2 files changed, 24 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java index bec7441b..6b522864 100644 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java @@ -19,19 +19,17 @@ class LogbackAppenderFactory { private static final String LOGBACK_LOGGING_EVENT = "ch.qos.logback.classic.spi.ILoggingEvent"; private final ClassLoader classLoader; + private final Class loggerContextClass; + private final Class appenderClass; + private final Class contextClass; + private final Class eventClass; - LogbackAppenderFactory(ClassLoader classLoader) { + LogbackAppenderFactory(ClassLoader classLoader) throws ClassNotFoundException { this.classLoader = classLoader; - } - - boolean isAvailable() { - try { - classLoader.loadClass(LOGBACK_LOGGER_CONTEXT); - classLoader.loadClass(LOGBACK_APPENDER); - return true; - } catch (ClassNotFoundException e) { - return false; - } + this.loggerContextClass = classLoader.loadClass(LOGBACK_LOGGER_CONTEXT); + this.appenderClass = classLoader.loadClass(LOGBACK_APPENDER); + this.contextClass = classLoader.loadClass(LOGBACK_CONTEXT); + this.eventClass = classLoader.loadClass(LOGBACK_LOGGING_EVENT); } Object attach(String name, Consumer listener, List loggerNames) @@ -40,8 +38,9 @@ Object attach(String name, Consumer listener, List loggerNam List attached = new ArrayList<>(); try { initAppender(appender); + Object loggerContext = getLoggerContext(); for (String loggerName : loggerNames) { - addAppenderToLogger(appender, loggerName); + addAppenderToLogger(loggerContext, appender, loggerName); attached.add(loggerName); } return appender; @@ -57,14 +56,17 @@ void detach(Object appender, List loggerNames) { } try { if (loggerNames != null) { + Object loggerContext = getLoggerContext(); for (String loggerName : loggerNames) { try { - detachAppenderFromLogger(appender, loggerName); + detachAppenderFromLogger(loggerContext, appender, loggerName); } catch (Exception e) { LOG.warn("Failed to detach appender from logger '{}'", loggerName, e); } } } + } catch (Exception e) { + LOG.warn("Failed to obtain logger context for detach", e); } finally { try { stopAppender(appender); @@ -74,10 +76,7 @@ void detach(Object appender, List loggerNames) { } } - private Object createAppender(String name, Consumer listener, List loggerNames) - throws ClassNotFoundException { - Class appenderClass = classLoader.loadClass(LOGBACK_APPENDER); - Class eventClass = classLoader.loadClass(LOGBACK_LOGGING_EVENT); + private Object createAppender(String name, Consumer listener, List loggerNames) { return Proxy.newProxyInstance( classLoader, new Class[] {appenderClass}, @@ -86,8 +85,7 @@ private Object createAppender(String name, Consumer listener, List ctxClass = classLoader.loadClass(LOGBACK_CONTEXT); - appender.getClass().getMethod("setContext", ctxClass).invoke(appender, loggerContext); + appender.getClass().getMethod("setContext", contextClass).invoke(appender, loggerContext); appender.getClass().getMethod("start").invoke(appender); } @@ -95,28 +93,23 @@ private void stopAppender(Object appender) throws ReflectiveOperationException { appender.getClass().getMethod("stop").invoke(appender); } - private Object getLoggerContext() throws ClassNotFoundException { - Class ctxClass = classLoader.loadClass(LOGBACK_LOGGER_CONTEXT); + private Object getLoggerContext() { Object ctx = org.slf4j.LoggerFactory.getILoggerFactory(); - if (ctx == null || !ctxClass.isInstance(ctx)) { + if (ctx == null || !loggerContextClass.isInstance(ctx)) { throw new IllegalStateException("SLF4J is not using Logback"); } return ctx; } - private void addAppenderToLogger(Object appender, String loggerName) throws ReflectiveOperationException { - Object loggerContext = getLoggerContext(); - Class loggerContextClass = classLoader.loadClass(LOGBACK_LOGGER_CONTEXT); + private void addAppenderToLogger(Object loggerContext, Object appender, String loggerName) + throws ReflectiveOperationException { Object logger = loggerContextClass.getMethod("getLogger", String.class).invoke(loggerContext, loggerName); - Class appenderClass = classLoader.loadClass(LOGBACK_APPENDER); logger.getClass().getMethod("addAppender", appenderClass).invoke(logger, appender); } - private void detachAppenderFromLogger(Object appender, String loggerName) throws ReflectiveOperationException { - Object loggerContext = getLoggerContext(); - Class loggerContextClass = classLoader.loadClass(LOGBACK_LOGGER_CONTEXT); + private void detachAppenderFromLogger(Object loggerContext, Object appender, String loggerName) + throws ReflectiveOperationException { Object logger = loggerContextClass.getMethod("getLogger", String.class).invoke(loggerContext, loggerName); - Class appenderClass = classLoader.loadClass(LOGBACK_APPENDER); logger.getClass().getMethod("detachAppender", appenderClass).invoke(logger, appender); } diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java index ba5487ef..a343dbff 100644 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackLogInterceptor.java @@ -54,8 +54,7 @@ private LogbackAppenderFactory getFactory() { if (cl == null) { return null; } - LogbackAppenderFactory factory = new LogbackAppenderFactory(cl); - return factory.isAvailable() ? factory : null; + return new LogbackAppenderFactory(cl); } catch (Exception e) { return null; } From 8dce28aaaf97db8bd23c9f79c35873bb4d13abac Mon Sep 17 00:00:00 2001 From: Krystian Panek Date: Tue, 10 Mar 2026 13:44:26 +0100 Subject: [PATCH 4/5] Minor --- .../dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java index 6b522864..6da5f341 100644 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogbackAppenderFactory.java @@ -37,8 +37,8 @@ Object attach(String name, Consumer listener, List loggerNam Object appender = createAppender(name, listener, loggerNames); List attached = new ArrayList<>(); try { - initAppender(appender); Object loggerContext = getLoggerContext(); + initAppender(appender, loggerContext); for (String loggerName : loggerNames) { addAppenderToLogger(loggerContext, appender, loggerName); attached.add(loggerName); @@ -83,8 +83,7 @@ private Object createAppender(String name, Consumer listener, List Date: Tue, 10 Mar 2026 14:00:10 +0100 Subject: [PATCH 5/5] Revert --- .../dev/vml/es/acm/core/code/log/LogInterceptorManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java b/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java index 166fd1ee..d1f01511 100644 --- a/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java +++ b/core/src/main/java/dev/vml/es/acm/core/code/log/LogInterceptorManager.java @@ -35,7 +35,7 @@ public LogInterceptor.Handle attach(Consumer listener, String... log return i.attach(listener, loggerNames); }) .orElseGet(() -> { - LOG.debug("No log interceptor available"); + LOG.warn("No log interceptor available"); return () -> {}; }); }