【发布时间】: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 谢谢你的建议。我没有对上面列出的代码进行任何更改或进行任何其他环境更改,但我注意到删除操作直到由于触发时间或大小策略而触发的翻转事件才执行。这是我的一个误解。再次感谢您的帮助。