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
>

Reply via email to