Log4j2 删除旧日志不起作用

Log4j2 Deleting Old Logs Not Working

我正在尝试以编程方式配置 Log4j2 v2.11.1,以使用作为 DefaultRolloverStrategy 一部分的新删除操作来删除旧文件。

正如您从我下面的代码中看到的那样,我将系统设置为每天创建日志文件并在文件大小达到 1 MB 时滚动文件。

我尝试将 Delete 操作添加到 DefaultRolloverStrategy,有两个条件 - IfFileName 和 IfLastModified。 IfFileName 指定文件的名称必须是 app.*.log 并且 IfLastModified 组件指定文件也必须存在一天才能被删除。

无论出于何种原因,这都不起作用。日志文件每天都会正确创建并根据大小滚动,但不会删除超过一天的文件。应用服务器日志中没有错误表明我在配置中犯了错误。

static Configuration createConfiguration(String name, ConfigurationBuilder<BuiltConfiguration> builder) {
    builder.setConfigurationName(name);
    LayoutComponentBuilder layoutBuilder  = builder.newLayout("PatternLayout").addAttribute("pattern", "%d [%t] %-5level: %msg%n");
    ComponentBuilder triggeringPolicy = builder.newComponent("Policies");
    triggeringPolicy.addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("interval", "1").addAttribute("modulate", "true"));
    triggeringPolicy.addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "1 MB"));

    ComponentBuilder rolloverStrategy = builder.newComponent("DefaultRolloverStrategy");

    ComponentBuilder ifFileName = builder.newComponent("IfFileName").addAttribute("glob", "app.*.log");
    ComponentBuilder ifLastModified = builder.newComponent("IfLastModified").addAttribute("age", "1d");

    ComponentBuilder deleteAction = builder.newComponent("Delete").addAttribute("basePath", "C:\applogs\").addAttribute("maxDepth", "1");
    deleteAction.addComponent(ifFileName).addComponent(ifLastModified);

    rolloverStrategy.addComponent(deleteAction);

    AppenderComponentBuilder appenderBuilder = builder.newAppender("rolling", "RollingFile")
            .addAttribute("fileName", "C:\applogs\app.log")
            .addAttribute("filePattern", "C:\applogs\app_%d{yyyy-MM-dd}-%i.log")
            .add(layoutBuilder)
            .addComponent(triggeringPolicy)
            .addComponent(rolloverStrategy);
    builder.add(appenderBuilder);
    builder.add(builder.newRootLogger(Level.INFO).add(builder.newAppenderRef("rolling")).addAttribute("additivity", false));
    Configuration config = builder.build();
    Configurator.initialize(config);
    return config;
}

附带说明一下,如果我删除删除操作的代码并添加以下行,系统会正确删除最旧的日志文件并保留最新的三个。

ComponentBuilder rolloverStrategy = builder.newComponent("DefaultRolloverStrategy").addAttribute("max", "3");

知道为什么我的年龄删除设置不起作用吗?我已经尝试删除 IfLastModified 组件以查看是否所有文件都被删除,但这也不起作用。

提前感谢您提供的任何建议。

如果其他人偶然发现我的问题,我想提供一个答案。我没有对问题中列出的原始代码进行任何更改。但是,当由于触发时间或大小策略而发生翻转事件时,删除操作最终被触发。这导致超过一天的日志文件(基于最后修改日期)被删除。

另外一个注意事项。有人回应说我应该打开 log4j2 调试,以便查看有关日志系统如何处理文件配置和翻转的内部详细信息。我的应用程序 运行 所在的应用程序服务器是 JBoss,我注意到添加值为 TRACE 的 log4j2.debug JVM 参数没有启用此内部日志记录。

相反,我没有设置 log4j2.debug 参数的值,如下所示。

-Dlog4j2.debug

当添加到 JBoss 的 standalone.bat 脚本文件中的 JAVA_OPTS 变量时,这起到了作用。