java - 默认 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>
?
解决方案
其中,当您配置 a 时,RollingFileAppender
您需要为filePattern
参数提供一个值。
此配置参数将指示生成的归档日志文件的文件名模式。
RolloverPolicy
此模式的格式取决于RollingFileAppender
.
默认情况下,Log4j 2 将使用Default Rollover Strategy。
此策略将允许您根据数字索引、通过指示%i
模式标记或按日期/时间、通过%d
在您的用例中指示模式标记来翻转日志。您也可以将数字索引添加到日期/时间模式:在这种情况下,数字索引将递增,直到日期/时间模式的结果发生变化。
如果您定义日期/时间模式,则需要通过在您的示例中传递兼容模式来提供将执行翻转的基本粒度。SimpleDateFormat
yyyy-MM-dd
我说的是基本粒度,而不仅仅是粒度,因为实际的日志翻转时刻将取决于您如何配置与RollingFileAppender
.
在这种情况下,TimeBasedTriggeringPolicy
您可以配置几个决定日志翻转行为的参数,主要是两个。
首先,您有interval
参数:它将根据日期模式中最具体的时间单位指示翻转应该发生的频率。即,如果像您的示例一样,您将天配置为最具体的单位并为参数提供一个值3
(1
默认情况下),interval
则翻转将每天发生3
。
其次,您可以激活(false
默认情况下)该modulate
参数。此参数指示是否应调整间隔以使下一次翻转发生在间隔边界上。Log4j2 文档提供了一个清晰的示例:
例如,如果项目是小时,当前时间是凌晨 3 点,间隔是 4,那么第一次翻转将发生在凌晨 4 点,然后下一个翻转将发生在早上 8 点、中午、下午 4 点等。
在您的用例中会发生类似的事情,但语义是一年中的一天。
请参阅该类的源代码以PatternProcessor
获取深入信息。increment
方法也要注意。
fileIndex
关于日志删除,据我所知,如果您在模式中使用数字索引(通过调整, min
end参数),默认翻转策略只会删除旧文件,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
使用此功能时提供正确的模式。
推荐阅读
- javascript - 如何解决未捕获的 TypeError:无法读取属性“字段”制表符
- c++ - ADL 不能在外面工作(即使是结构)
- python - Python 停止生成器中的进程
- amazon-web-services - SNS FIFO 主题不将消息扇出到 SQS FIFO 队列
- node.js - 在 Mikro-ORM 中多次分叉 EntityManager 意味着什么?
- odata - 简单的 OData 客户端 - 在运行时创建 OrderBy 表达式?
- mysql - 如何使用 Rails 中的 update_all() 方法传递可变参数值?
- kubernetes - 字段“resource.subnetwork”的值无效。如果网络资源处于自定义子网模式,网络接口必须指定子网
- r - 从 sliderInput 更新 rhandsontable
- javascript - Godot 无法在 python 烧瓶服务器上加载 .pck 文件;任何人都可以建议修复吗?