我使用的是log4j-slf4j-impl版本2.12.1。 还有一个将通过命令行执行并在完成后终止的应用程序。
应用程序在本地主机中不会一次执行,但是有可能我们在先前的应用程序运行时再次运行它。 因此,我想按yyyyMMdd-HHmmss分隔日志文件,然后在应用程序启动时,如果文件修改时间超过指定的时间(此处设置为1分钟),则删除日志文件。
我的log4j2.xml内容:
<RollingFile name="default"
filePattern="${output.folder}/my.%d{yyyyMMdd-HHmmss}.log">
<PatternLayout pattern="${pattern}" />
<Policies>
<OnStartupTriggeringPolicy minSize="0" />
</Policies>
<DirectWriteRolloverStrategy>
<Delete basePath="${output.folder}" maxDepth="1">
<IfFileName glob="my*.log" />
<IfLastModified age="1m" />
</Delete>
</DirectWriteRolloverStrategy>
</RollingFile>
日志文件如下所示:
问题是以上log4j2设置不起作用。 旧的日志记录文件不会被删除。 我的log4j2设置有问题吗?
非常感谢您提出任何意见。
--- 20191203T160657 + 0800 ---
我按照@metters建议按如下所示替换为log4j2.xml:
<RollingFile name="default"
filePattern="${output.folder}/my.%d{yyyyMMdd-HHmmss}.log">
<PatternLayout pattern="${pattern}" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<DirectWriteRolloverStrategy>
<Delete basePath="${output.folder}" maxDepth="1">
<IfFileName glob="my*.log" />
<IfLastModified age="1m" />
</Delete>
</DirectWriteRolloverStrategy>
</RollingFile>
我的测试应用程序是
public class Library {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
public static void main(String[] args) throws InterruptedException {
log.info("Hi");
for(int i = 0; i< 5 ; i++)
{
TimeUnit.SECONDS.sleep(1);
log.info("{}", i);
}
}
}
正确删除了旧文件,但是每秒将创建新的日志文件。 根据我的测试应用程序,创建了6个文件:
Log4j2正在逐秒滚动文件。日志消息应写入my.20191203-160338.log。
我试图跟踪代码并发现一些奇怪的东西。
首先,输出流(如下所示)将为null,因为使用DirectWriteRolloverStrategy时没有fileName属性:
第二,由于OutputStream为null,因此RollingFileManager在自己的转换方法中什么也不做,因此没有机会进行DirectWriteRolloverStrategy的转换(如下所示):
我理解不正确吗?
如果我做错了什么或有任何建议,请告诉我。
非常感谢您。
答案 0 :(得分:0)
我尝试在本地运行(不是并行运行),并通过将<OnStartupTriggeringPolicy minSize="0" />
更改为<TimeBasedTriggeringPolicy interval="1" modulate="true" />
通过这种配置,每秒创建一个新文件(我的程序在无限循环中每秒钟调用一次log.info())。
一分钟后,最旧的文件被删除,文件夹中的文件数从未超过61。 只需根据您的需要调整配置(每分钟一个文件,等等),您应该会很方便。