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.
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")