Log4j:代码配置DefaultRolloverStrategy失效,仅保留2个日志文件
Log4j 2.x 滚动日志策略max值不生效问题排查
问题根源分析
你的代码存在两个关键问题,导致DefaultRolloverStrategy的max=15配置不生效:
日志文件名模板格式错误
你设置的filePattern末尾多了一个多余的点:.addAttribute("filePattern", fileName + "-%i.log.")Log4j依靠
filePattern识别已归档的日志文件,多余的后缀会让它无法匹配历史归档文件,因此每次滚动只会生成-1.log,无法按照max值保留更多文件。正确格式应去掉末尾的点:.addAttribute("filePattern", fileName + "-%i.log")重复初始化配置导致覆盖混乱
你先后创建两个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
相关产品推荐
相关产品推荐

