Log4j:如何以编程方式设置 DefaultRolloverStrategy?

问题描述 投票:0回答:1

我使用下面的代码以编程方式设置我的 Log4j 配置。

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());
}

将 SizeBasedTriggeringPolicy 设置为 10KB(我使用较低的值进行测试)效果很好,但将 DefaultRolloverStrategy 设置为 15 个文件不起作用。我在这里做错了什么?它只保留原始文件,然后保留第二个文件(-1.log)。

仅供参考:我使用的是 Log4j 2.20.0 和 Java 8u381。

java log4j log4j2
1个回答
0
投票

我想通了。文件末尾有一个额外的点Pattern。删除后,它按预期工作。

请注意原始问题和下面的代码片段的区别。

.addAttribute("filePattern", fileName + "-%i.log")
© www.soinside.com 2019 - 2024. All rights reserved.