【问题标题】:Log4j2 Deleting Old Logs Not WorkingLog4j2 删除旧日志不起作用
【发布时间】:2018-08-03 22:11:49
【问题描述】:

我正在尝试以编程方式配置 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.debug 设置为 TRACE 以在配置和翻转期间获取详细的内部 log4j 日志。 logging.apache.org/log4j/2.x/faq.html#troubleshooting另外,你有没有试过在log4j用户邮件列表上询问?
  • @RemkoPopma 谢谢你的建议。我没有对上面列出的代码进行任何更改或进行任何其他环境更改,但我注意到删除操作直到由于触发时间或大小策略而触发的翻转事件才执行。这是我的一个误解。再次感谢您的帮助。

标签: java logging log4j2


【解决方案1】:

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

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

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

-Dlog4j2.debug

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2021-11-19
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2016-04-14
    相关资源
    最近更新 更多