Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用OnStartupRiggeringPolicy和DirectWriteRolloverStrategy删除旧日志文件_Java_Log4j2 - Fatal编程技术网

Java 使用OnStartupRiggeringPolicy和DirectWriteRolloverStrategy删除旧日志文件

Java 使用OnStartupRiggeringPolicy和DirectWriteRolloverStrategy删除旧日志文件,java,log4j2,Java,Log4j2,我正在使用log4j-slf4j-impl版本2.12.1。 以及一个将通过命令行执行并在完成后终止的应用程序 该应用程序不会在本地主机上同时执行多次,但我们可以在上一个应用程序运行时再次运行它。 因此,我想按yyyyMMdd HHmmss分隔日志文件,然后在应用程序启动时,如果文件修改时间超过指定的时间(这里我设置为1分钟用于测试),则删除这些文件 我的log4j2.xml内容: 日志文件如下所示: my.20191127-091410.log my.20191127-091415.lo

我正在使用log4j-slf4j-impl版本2.12.1。 以及一个将通过命令行执行并在完成后终止的应用程序

该应用程序不会在本地主机上同时执行多次,但我们可以在上一个应用程序运行时再次运行它。 因此,我想按yyyyMMdd HHmmss分隔日志文件,然后在应用程序启动时,如果文件修改时间超过指定的时间(这里我设置为1分钟用于测试),则删除这些文件

我的log4j2.xml内容:


日志文件如下所示:

  • my.20191127-091410.log
  • my.20191127-091415.log
  • my.20191127-091527.log
  • my.20191127-091533.log
问题在上面,log4j2设置不起作用。 旧的日志文件不会被删除。 我的log4j2设置是否有问题

非常感谢您的评论

---20191203T160657+0800---

根据@Meters的建议,我将log4j2.xml中的替换为,如下所示:


我的测试申请是

公共类库{
私有静态最终记录器log=LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
公共静态void main(字符串[]args)引发InterruptedException{
日志信息(“Hi”);
对于(int i=0;i<5;i++)
{
时间单位。秒。睡眠(1);
log.info(“{}”,i);
}
}
}
已正确删除旧文件,但每秒将创建新日志文件。 根据我的测试应用程序,创建了6个文件:

  • my.20191203-160338.log包含“Hi”
  • my.20191203-160339.log包含“0”
  • my.20191203-160340.log包含“1”
  • my.20191203-160341.log包含“2”
  • my.20191203-160342.log包含“3”
  • my.20191203-160343.log包含“4”
Log4j2正在以秒为单位滚动文件。日志消息应写入my.20191203-160338.Log

我试图追踪代码,发现了一些奇怪的东西

首先,outputstream(如下所示)将为null,因为在使用DirectWriteRolloverStrategy时没有fileName属性:

其次,RollingFileManager在其自己的滚动方法中没有任何内容,因为OutputStream为null,因此没有机会进行DirectWriteRolloverStrategy的滚动(如下所示):

我理解错了吗

如果我做错了什么或有什么建议,请告诉我


非常感谢。

我尝试在本地运行此程序(不是并行运行),并通过将
更改为
来删除超过一分钟的日志文件

通过这种配置,每秒都会创建一个新文件(我的程序在无限循环中每秒创建一次log.info()

一分钟后,最旧的文件被删除,我的文件夹中从来没有超过61个文件。
只要根据您的需要调整配置(每分钟一个文件等),您就可以开始了。

谢谢,但每分钟一个文件不符合我的要求,因为一分钟内可以执行多个应用程序。每个正在运行的应用程序都必须将日志写入自己的文件。如果有任何想法,请告诉我,谢谢。解决方案不是“每分钟一个文件”。我的解决方案是根据请求触发旧文件的删除。请像我在回答中写的那样调整配置,并测试文件是否被删除。嗨,我更新了我的帖子,请查看结果。非常感谢。