I have the following Logging.groovy
import ch.qos.logback.classic.Level
import ch.qos.logback.classic.LoggerContext
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.ConsoleAppender
import .slf4j.Logger
import .slf4j.LoggerFactory
static void setupLibraryLoggers() {
def jgitLogger = LoggerFactory.getLogger(".eclipse.jgit")
jgitLogger.setLevel(Level.INFO)
}
static Logger setupLogger() {
LoggerContext logCtx = LoggerFactory.getILoggerFactory();
PatternLayoutEncoder logEncoder = new PatternLayoutEncoder();
logEncoder.setContext(logCtx);
logEncoder.setPattern("%-12date{YYYY-MM-dd HH:mm:ss.SSS} %highlight(%-5level) - %msg%n");
logEncoder.start();
ConsoleAppender logConsoleAppender = new ConsoleAppender();
logConsoleAppender.setContext(logCtx);
logConsoleAppender.setName("console");
logConsoleAppender.setEncoder(logEncoder);
logConsoleAppender.start();
Logger log = logCtx.getLogger(this.class);
log.setAdditive(false);
log.setLevel(Level.DEBUG);
log.addAppender(logConsoleAppender);
return log;
}
In the same directory, I have the following Runner.groovy
@Grapes(
[
@Grab(group = '.eclipse.jgit', module = '.eclipse.jgit', version = '7.1.0.202411261347-r'),
@Grab(group = 'ch.qos.logback', module = 'logback-classic', version = '1.5.16'),
@Grab(group='de.gesellix', module='docker-client', version='2025-01-19T00-00-00'),
@Grab(group='commons-io', module='commons-io', version='2.18.0'),
@Grab(group='.apachemons', module='commons-compress', version='1.27.1')
]
)
import static Logging.setupLogger
import static Logging.setupLibraryLoggers
Logging.setupLibraryLoggers()
log = Logging.setupLogger()
log.info("Test")
If I run this with Groovy 2.5.23, this works correctly. However, if I try to go up to Groovy
/usr/local/groovy-4.0.25/bin/groovy -cp $HOME/workspace/jobs ~/workspace/jobs/Runner.groovy
SLF4J(W): No SLF4J providers were found.
SLF4J(W): Defaulting to no-operation (NOP) logger implementation
SLF4J(W): See .html#noProviders for further details.
Caught: groovy.lang.MissingMethodException: No signature of method: .slf4j.helpers.NOPLogger.setLevel() is applicable for argument types: (ch.qos.logback.classic.Level) values: [INFO]
groovy.lang.MissingMethodException: No signature of method: .slf4j.helpers.NOPLogger.setLevel() is applicable for argument types: (ch.qos.logback.classic.Level) values: [INFO]
at Logging.setupLibraryLoggers(Logging.groovy:10)
at Runner.run(Runner.groovy:18)
It looks like I'm importing the correct logback library (grape). Why does going up to Groovy 4 cause SLF4J to not correctly identify and load the Logback logging backend?