Search code examples
javalog4jlog4j2

Log4j: How to set DefaultRolloverStrategy programmatically?


I am using the code below to set my Log4j configuration programmatically.

private void initLog4JConfig() {
    if (!firstCall) {
        return;
    }

    Level logLevel = Level.INFO;
    String pattern = "%d{yyyy-MM-dd HH:mm:ss,SSS} | %-5p | %m%n";
    String fileName = GlobalData.getLogFileName();

    if (GlobalData.getDebugLevel() > 10) {
        logLevel = Level.DEBUG;
    }

    // console
    ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
    builder.setStatusLevel(logLevel);
    builder.setConfigurationName("DefaultLogger");

    AppenderComponentBuilder appenderBuilder
            = builder.newAppender("Console", "CONSOLE").addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);

    appenderBuilder.add(builder.newLayout("PatternLayout"))
            .addAttribute("pattern", pattern);
    RootLoggerComponentBuilder rootLogger = builder.newRootLogger(logLevel);
    rootLogger.add(builder.newAppenderRef("Console"));

    builder.add(appenderBuilder);
    builder.add(rootLogger);
    Configurator.reconfigure(builder.build());

    // rolling file
    ConfigurationBuilder<BuiltConfiguration> builder2 = ConfigurationBuilderFactory.newConfigurationBuilder();
    builder2.setStatusLevel(logLevel);
    builder2.setConfigurationName("DefaultRollingFileLogger");

    LayoutComponentBuilder layoutBuilder = builder2.newLayout("PatternLayout")
            .addAttribute("pattern", pattern);
    ComponentBuilder triggeringPolicy = builder2.newComponent("Policies")
            .addComponent(builder2.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "10KB"));
    ComponentBuilder filePolicy = builder2.newComponent("DefaultRolloverStrategy").addAttribute("max", 15);

    AppenderComponentBuilder appenderBuilder2 = builder2.newAppender("LogToRollingFile", "RollingFile")
            .addAttribute("fileName", fileName + ".log")
            .addAttribute("filePattern", fileName + "-%i.log.")
            .add(layoutBuilder)
            .addComponent(triggeringPolicy)
            .addComponent(filePolicy);

    builder2.add(appenderBuilder2);
    rootLogger.add(builder2.newAppenderRef("LogToRollingFile"));
    builder2.add(rootLogger);
    Configurator.reconfigure(builder2.build());
}

Setting the SizeBasedTriggeringPolicy to 10KB (I am using a low value for testing) works fine, but setting the DefaultRolloverStrategy to 15 files does not work. What am I doing wrong here? It only keeps the original file and then a second file (-1.log).

FYI: I am on Log4j 2.20.0 and Java 8u381.


Solution

  • I figured it out. There was an extra point at the end of the filePattern. After removing that, it worked as expected.

    Note the difference in the original question and the code snippet below.

    .addAttribute("filePattern", fileName + "-%i.log")