Looking for Groovy help in configuring log4j2 RollingFileAppenders.
I have this simple example working but of course it "logs" to stdout.
import groovy.util.logging.Log4j2
@Log4j2
class MyApp {
static void main(String[] args) {
log.error "Hello world!"
}
}
$ export CLASSPATH=$LIBS/log4j-api-2.20.0.jar:$LIBS/log4j-core-2.20.0.jar
$ groovy my-example.groovy
13:44:16.939 [main] ERROR MyApp - Hello world!
I am looking for some Groovy-oriented examples of how to configure a RollingFileAppender so I could log to files (and have them auto-rotate, control the format, etc).
There are lots of Java examples available but I am hoping to find something more Groovy-like. :)
EDIT - here's an example of some Java configuration I was hoping to avoid -
import org.apache.logging.log4j.Level
import org.apache.logging.log4j.core.Filter
import org.apache.logging.log4j.core.config.Configurator
import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder
import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory
import org.apache.logging.log4j.core.config.builder.api.FilterComponentBuilder
import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder
import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder
// configure console appender
ConfigurationBuilder builder
= ConfigurationBuilderFactory.newConfigurationBuilder()
AppenderComponentBuilder console
= builder.newAppender("stdout", "Console")
builder.add(console)
// configure log file
AppenderComponentBuilder file
= builder.newAppender("log", "File")
file.addAttribute("fileName", "myapp.log")
builder.add(file)
// configure rolling file appender
AppenderComponentBuilder rollingFile
= builder.newAppender("rolling", "RollingFile")
rollingFile.addAttribute("fileName", "myapp.log")
rollingFile.addAttribute("filePattern", "myapp-%d{MM-dd-yy}.log.gz")
builder.add(rollingFile)
// configure filters
FilterComponentBuilder flow = builder.newFilter(
"MarkerFilter",
Filter.Result.ACCEPT,
Filter.Result.DENY)
flow.addAttribute("marker", "FLOW")
console.add(flow)
// configure log record format
LayoutComponentBuilder standard
= builder.newLayout("PatternLayout")
standard.addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable")
console.add(standard)
file.add(standard)
rollingFile.add(standard)
// configure rootLogger
RootLoggerComponentBuilder rootLogger
= builder.newRootLogger(Level.ERROR)
rootLogger.add(builder.newAppenderRef("stdout"))
builder.add(rootLogger)
// configuring additional loggers
LoggerComponentBuilder logger = builder.newLogger("com", Level.DEBUG)
logger.add(builder.newAppenderRef("log"))
logger.addAttribute("additivity", false)
builder.add(logger);
// configuring other components, e.g. triggering policy for rolling file appenders
ComponentBuilder triggeringPolicies = builder.newComponent("Policies")
.addComponent(builder.newComponent("CronTriggeringPolicy")
.addAttribute("schedule", "0 0 0 * * ?"))
.addComponent(builder.newComponent("SizeBasedTriggeringPolicy")
.addAttribute("size", "100M"))
rollingFile.addComponent(triggeringPolicies)
// initialize logger
Configurator.initialize(builder.build())
Now granted, not all of that configuration is required but there's a lot of what some might call "boilerplate". :)
Thanks in advance for any help.