looking for groovy log4j2 rollingfileappender example

46 views Asked by At

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.

0

There are 0 answers