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 变量时,这起到了作用。
我正在尝试以编程方式配置 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 变量时,这起到了作用。