You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Log4j:代码配置DefaultRolloverStrategy失效,仅保留2个日志文件

Log4j 2.x 滚动日志策略max值不生效问题排查

问题根源分析

你的代码存在两个关键问题,导致DefaultRolloverStrategy的max=15配置不生效:

  1. 日志文件名模板格式错误
    你设置的filePattern末尾多了一个多余的点:

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

    Log4j依靠filePattern识别已归档的日志文件,多余的后缀会让它无法匹配历史归档文件,因此每次滚动只会生成-1.log,无法按照max值保留更多文件。正确格式应去掉末尾的点:

    .addAttribute("filePattern", fileName + "-%i.log")
    
  2. 重复初始化配置导致覆盖混乱
    你先后创建两个ConfigurationBuilder并两次调用Configurator.reconfigure,第二次调用会完全覆盖第一次的配置;同时将第一个builder创建的rootLogger重复添加到第二个builder中,进一步导致配置逻辑混乱。正确做法是在同一个配置构建器中同时添加控制台和滚动文件两个appender,避免重复覆盖。

修正后的代码示例

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

    // 统一使用一个ConfigurationBuilder配置所有appender
    ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
    builder.setStatusLevel(logLevel);
    builder.setConfigurationName("DefaultLogger");

    // 配置控制台Appender
    AppenderComponentBuilder consoleAppender = builder.newAppender("Console", "CONSOLE")
            .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
    consoleAppender.add(builder.newLayout("PatternLayout"))
            .addAttribute("pattern", pattern);
    builder.add(consoleAppender);

    // 配置滚动文件Appender
    LayoutComponentBuilder fileLayout = builder.newLayout("PatternLayout")
            .addAttribute("pattern", pattern);
    // 滚动触发策略
    ComponentBuilder triggeringPolicy = builder.newComponent("Policies")
            .addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "10KB"));
    // 滚动归档策略,设置max=15
    ComponentBuilder rolloverStrategy = builder.newComponent("DefaultRolloverStrategy")
            .addAttribute("max", 15);

    AppenderComponentBuilder rollingFileAppender = builder.newAppender("LogToRollingFile", "RollingFile")
            .addAttribute("fileName", fileName + ".log")
            .addAttribute("filePattern", fileName + "-%i.log") // 修正filePattern格式
            .add(fileLayout)
            .addComponent(triggeringPolicy)
            .addComponent(rolloverStrategy);
    builder.add(rollingFileAppender);

    // 配置根Logger,添加两个Appender引用
    RootLoggerComponentBuilder rootLogger = builder.newRootLogger(logLevel);
    rootLogger.add(builder.newAppenderRef("Console"));
    rootLogger.add(builder.newAppenderRef("LogToRollingFile"));
    builder.add(rootLogger);

    // 只执行一次配置刷新
    Configurator.reconfigure(builder.build());
}

额外验证点

  • 确保日志目录有读写权限,否则Log4j可能无法创建归档文件
  • 可将builder.setStatusLevel(Level.DEBUG),开启Log4j自身调试日志,查看滚动过程中的详细信息,排查是否有其他异常

内容的提问来源于stack exchange,提问作者Malawirel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:43:13