默认 log4j 策略

时间:2021-02-01 13:32:55

标签: java spring logging log4j slf4j

我试图了解 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>

2 个答案:

答案 0 :(得分:1)

<块引用>

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

TimeBasedTriggeringPolicy 控制下一次翻转发生的时间。根据提供的日期单位确定下一次翻转时间。 {yyyy-MM-dd} 表示是第二天。在没有其他触发策略的情况下,所有日志都附加到当天文件中。

DefaultRolloverStrategy 控制何时基于文件模式归档/删除/创建日志文件。第二天到来时,将创建具有当前日期的新文件,并将所有日志附加到新文件中。根据翻转策略配置,可以保留或删除前一天的文件。 maxmin 属性控制文件模式中带有 %i 说明符以维护文件计数器和 fileIndex 以控制文件重命名的文件数。

原创

<块引用>

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

%d 是转换说明符 - Log4j 2 具有用于不同转换说明符的转换器。 %d 指的是日期并允许您发送日期格式。日期时间单位本身控制翻转发生的时间。 %m 在 log4j2 中无法识别,而您每个月都会使用 %d{yyyy-MM} 创建文件。您可以使用 modulate 标志在间隔边界处滚动文件 - 月初。

<块引用>

为了确保只有当天的日志文件可用并且 如果将策略修改为:

,则删除其他日志文件

/RollingRandomAccessFile> ?

是的,这是正确的。 interval="1" 是默认值,因此可以删除。 DefaultRollOverStrategy 在您未指定任何翻转策略时应用。默认翻转策略将使用提供的文件名模式进行翻转。由于这是每天 (-dd),它将每天滚动文件,同一天没有中间文件。

来自docs -

<块引用>

RollingRandomAccessFileAppender 需要一个 TriggeringPolicy 和一个 滚动策略。触发策略确定是否翻转 应该在 RolloverStrategy 定义如何 应该进行翻转。如果没有配置 RolloverStrategy, RollingRandomAccessFileAppender 将使用 DefaultRolloverStrategy

您可以使用适当的触发策略和翻转策略进一步自定义。

答案 1 :(得分:1)

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

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

此模式的格式取决于 RolloverPolicy 使用的 RollingFileAppender

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

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

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

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

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

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

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

<块引用>

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

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

请参阅 PatternProcessor 类的 source code 以获取深入信息。还要注意 increment method

关于日志删除,据我所知,如果您在模式中使用数字索引(通过调整 fileIndex, min end {{1 }} 参数)但是,从 Log4j 2.5 开始,您可以使用 delete action 在发生日志翻转时执行基于日期/时间的日志的清理(在 Log4j 中将操作视为一种钩子)。

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

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> 使用此功能时的模式。