首页 > 解决方案 > 默认 log4j 策略

问题描述

我试图了解如何TimeBasedTriggeringPolicy确定何时创建/附加/删除日志文件。

对于以下配置:

<RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}"
<Policies>
 <TimeBasedTriggeringPolicy />
</Policies>
</RollingRandomAccessFile>

这个对吗:

该参数表示每天都会创建一个%d附加了当前的新日志文件 test.log ?{yyyy-MM-dd}以前版本的 test.log 没有被删除?如果我将 %d 更改为 %M 是否应该每个月创建一个新文件?

为了确保只有当天的日志文件可用并删除其他日志文件,应将策略修改为:

<RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}"
<Policies>
 <TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>

?

标签: javaspringlogginglog4jslf4j

解决方案


其中,当您配置 a 时,RollingFileAppender您需要为filePattern参数提供一个值。

此配置参数将指示生成的归档日志文件的文件名模式。

RolloverPolicy此模式的格式取决于RollingFileAppender.

默认情况下,Log4j 2 将使用Default Rollover Strategy

此策略将允许您根据数字索引、通过指示%i模式标记或按日期/时间、通过%d在您的用例中指示模式标记来翻转日志。您也可以将数字索引添加到日期/时间模式:在这种情况下,数字索引将递增,直到日期/时间模式的结果发生变化。

如果您定义日期/时间模式,则需要通过在您的示例中传递兼容模式来提供将执行翻转的基本粒度。SimpleDateFormatyyyy-MM-dd

我说的是基本粒度,而不仅仅是粒度,因为实际的日志翻转时刻将取决于您如何配置与RollingFileAppender.

在这种情况下,TimeBasedTriggeringPolicy您可以配置几个决定日志翻转行为的参数,主要是两个。

首先,您有interval参数:它将根据日期模式中最具体的时间单位指示翻转应该发生的频率。即,如果像您的示例一样,您将天配置为最具体的单位并为参数提供一个值31默认情况下),interval则翻转将每天发生3

其次,您可以激活(false默认情况下)该modulate参数。此参数指示是否应调整间隔以使下一次翻转发生在间隔边界上。Log4j2 文档提供了一个清晰的示例:

例如,如果项目是小时,当前时间是凌晨 3 点,间隔是 4,那么第一次翻转将发生在凌晨 4 点,然后下一个翻转将发生在早上 8 点、中午、下午 4 点等。

在您的用例中会发生类似的事情,但语义是一年中的一天。

请参阅该类的源代码PatternProcessor获取深入信息。increment方法也要注意。

fileIndex关于日志删除,据我所知,如果您在模式中使用数字索引(通过调整, minend参数),默认翻转策略只会删除旧文件,max但是,从 Log4j 2.5 开始,您可以使用删除操作来执行发生日志翻转时清理基于日期/时间的日志(在 Log4j 中,将操作视为一种钩子)。

例如,如果您只需要保留日志文件30几天,您可以使用以下内容配置此功能:

<RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}">
  <Policies>
    <TimeBasedTriggeringPolicy/>
  </Policies>
  <DefaultRolloverStrategy>
    <Delete basePath="/logs">
      <IfFileName glob="test.log.*" />
      <IfLastModified age="30d" />
    </Delete>
  </DefaultRolloverStrategy>
</RollingRandomAccessFile>

重要的是要知道删除过程会影响任何文件,而不仅仅是日志文件:请务必参数化应该执行的正确路径,并在glob使用此功能时提供正确的模式。


推荐阅读