使用OnStartupTriggeringPolicy和DirectWriteRolloverStrategy

时间:2019-11-29 07:12:06

标签: java log4j2

我使用的是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>

日志文件如下所示:

  • my.20191127-091410.log
  • my.20191127-091415.log
  • my.20191127-091527.log
  • my.20191127-091533.log

问题是以上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个文件:

  • my.20191203-160338.log包含“嗨”。
  • 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。

我试图跟踪代码并发现一些奇怪的东西。

首先,输出流(如下所示)将为null,因为使用DirectWriteRolloverStrategy时没有fileName属性: outputstream is null in RollingFileManager

第二,由于OutputStream为null,因此RollingFileManager在自己的转换方法中什么也不做,因此没有机会进行DirectWriteRolloverStrategy的转换(如下所示): no rollover due to outputstream is null

我理解不正确吗?

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

非常感谢您。

1 个答案:

答案 0 :(得分:0)

我尝试在本地运行(不是并行运行),并通过将<OnStartupTriggeringPolicy minSize="0" />更改为<TimeBasedTriggeringPolicy interval="1" modulate="true" />

设法删除了超过一分钟的日志文件。

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

一分钟后,最旧的文件被删除,文件夹中的文件数从未超过61。 只需根据您的需要调整配置(每分钟一个文件,等等),您应该会很方便。