Log4j2删除旧日志不起作用

时间:2018-08-03 22:11:50

标签: java logging log4j2

我试图以编程方式将Log4j2 v2.11.1配置为使用新的Delete(删除)操作作为DefaultRolloverStrategy的一部分来删除旧文件。

从下面的代码中可以看到,我设置了系统,每天创建日志文件,并在文件大小达到1 MB时翻转文件。

我尝试使用两个条件-IfFileName和IfLastModified将Delete动作添加到DefaultRolloverStrategy上。 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;
}

顺便说一句,如果我删除了delete操作的代码并添加了以下行,则系统会正确删除已滚动的最旧的日志文件并保留最新的三个文件。

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

有什么想法为什么我的年龄删除设置不起作用?我尝试删除IfLastModified组件以查看是否删除了所有文件,但这也行不通。

预先感谢您可以提供的任何建议。

1 个答案:

答案 0 :(得分:0)

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

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

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

-Dlog4j2.debug

当将其添加到JBoss的standalone.bat脚本文件中的JAVA_OPTS变量中时,就可以达到目的。

相关问题