Interesting! I did some more testing. most combinations does work but i found two that yield surprising results:
1. Instantiate logger without specifier gives log name as IndyInterface #!/usr/bin/env groovy @Grab(group='org.apache.logging.log4j', module='log4j-api', version='2.20.0') @Grab(group='org.apache.logging.log4j', module='log4j-core', version='2.20.0') @Grab(group='org.apache.logging.log4j', module='log4j-slf4j-impl', version='2.20.0') import org.apache.logging.log4j.Logger import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Level final Logger log = LogManager.getLogger() log.setLevel(Level.INFO) println "Running script $this.class" log.info('Hello world') // will print: // Running script class noSpecifierInstanceConfig // 10:12:18.256 [main] INFO org.codehaus.groovy.vmplugin.v8.IndyInterface - Hello world 2. Setting the root level and give the logger the script class yields no output: #!/usr/bin/env groovy @Grab(group='org.apache.logging.log4j', module='log4j-api', version='2.20.0') @Grab(group='org.apache.logging.log4j', module='log4j-core', version='2.20.0') @Grab(group='org.apache.logging.log4j', module='log4j-slf4j-impl', version='2.20.0') import groovy.transform.Field import org.apache.logging.log4j.Logger import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Level import org.apache.logging.log4j.core.config.Configurator Configurator.setRootLevel(Level.INFO) @Field final Logger log = LogManager.getLogger(this.class) println "Running script $this.class" // This will NOT work, no log output is generated // note that LogManager.getLogger() DOES work and so does LogManager.getLogger(this.class.name) log.info('Hello world') This will not log anything, only the println will be shown. The variant with LogManager.getLogger(this.class.name) does work however The variations i tried are here in case anyone want to verify: https://github.com/perNyfelt/groovy-issues/tree/main/logging/src Best regards, Per On Tue, 19 Aug 2025 at 13:18, Jochen Theodorou <blackd...@gmx.org> wrote: > > > On 19.08.25 09:31, Per Nyfelt wrote: > [...] > > 1. Set the log level on the root logger > > @Grab(group='org.apache.logging.log4j', module='log4j-api', > > version='2.20.0'), > > @Grab(group='org.apache.logging.log4j', module='log4j-core', > > version='2.20.0'), > > @Grab(group='org.apache.logging.log4j', module='log4j-slf4j-impl', > > version='2.20.0') > > > > import org.apache.logging.log4j.Logger > > import org.apache.logging.log4j.LogManager > > import org.apache.logging.log4j.Level > > import org.apache.logging.log4j.core.config.Configurator > > > > Configurator.setRootLevel(Level.INFO) > > > > @Field > > final Logger log = LogManager.getLogger() > > > > In this case only LogManager.getLogger() works, > > LogManager.getLogger(this.class) does not work. > > not the reverse? getLogger should have the problem, > getLogger(this.class) maybe not. That is also what I can verify. > > [...] > > I.e. IndyInterface instead of my script class. > > yeah, we have at least one bug in the indy callsite caching code, that > is causing this. Would be nice if LOG4j had a way to ignore classes in > that discovery phase... it does not, right? > > > To make log output better you need to do (the script name is > > createExcel.groovy) > > > > @Field > > final Logger log = LogManager.getLogger(this.class.name < > http://this.class.name>) > > Configurator.setLevel(log.getName(), Level.INFO) > > Configurator.setRootLevel(Level.INFO) > > LogManager.getContext(false).updateLoggers() > > > > 09:24:29.625 [main] INFO createExcel - Found 2 CSV files to process. > > > > LogManager.getLogger(this.class) does NOT work (results in no output) > which is curious. > > In my test it was for example Script1 if executed from a GroovyShell, or > the script name as class name if executed from the command line. > > bye Jochen >