我试图了解 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>
?
最佳答案
其中,当您配置 RollingFileAppender
时您需要为 filePattern
提供一个值参数。
此配置参数将指示生成的归档日志文件的文件名模式。
此模式的格式取决于 RolloverPolicy
由 RollingFileAppender
使用.
默认情况下,Log4j 2 将使用 Default Rollover Strategy .
此策略将允许您根据数字索引滚动日志,方法是指示 %i
模式标记或按日期/时间,通过指示 %d
模式 token 如您的用例所示。您也可以将数字索引添加到日期/时间模式:在这种情况下,数字索引将递增,直到日期/时间模式的结果发生更改。
如果您定义日期/时间模式,则需要通过传递 SimpleDateFormat
来提供将执行翻转的基本粒度。兼容模式,yyyy-MM-dd
在你的例子中。
我说的是基本粒度,而不仅仅是粒度,因为实际的日志滚动时刻将取决于您如何配置与 RollingFileAppender
关联的触发策略。 .
以 TimeBasedTriggeringPolicy
为例您可以配置几个参数来确定日志滚动行为,主要是两个。
首先,您有 interval
参数:它将指示基于日期模式中最具体的时间单位发生滚动的频率。即,如果如您的示例所示,您将天配置为最具体的单位并提供值 3
(默认为 1
)对于 interval
参数翻转将每隔 3
发生一次天。
其次,您可以激活(默认为 false
)modulate
范围。该参数指示是否应调整间隔以使下一次翻转发生在间隔边界上。 Log4j2 文档提供了一个清晰的示例:
For example, if the item is hours, the current hour is 3 am and the interval is 4 then the first rollover will occur at 4 am and then next ones will occur at 8 am, noon, 4pm, etc.
在您的用例中会出现类似的情况,但具有一年中的某一天的语义。
请参阅source code PatternProcessor
的类(class)以获取深入信息。关注 increment
method也是如此。
关于日志删除,据我所知,如果您在模式中使用数字索引,默认的翻转策略只会删除旧文件(通过调整 fileIndex
、 min
end max
参数)但是,从 Log4j 2.5 开始,您可以使用 delete action当日志翻转发生时,执行基于日期/时间的日志的清理(在 Log4j 中,将 actions 视为一种钩子(Hook))。
例如,如果您只需要保留 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
使用此功能时的模式。
关于java - 默认 log4j 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65993624/