我试图了解 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>
?
答案 0 :(得分:1)
我试图了解 TimeBasedTriggeringPolicy 如何确定何时 创建/附加/删除日志文件。
TimeBasedTriggeringPolicy
控制下一次翻转发生的时间。根据提供的日期单位确定下一次翻转时间。 {yyyy-MM-dd}
表示是第二天。在没有其他触发策略的情况下,所有日志都附加到当天文件中。
DefaultRolloverStrategy
控制何时基于文件模式归档/删除/创建日志文件。第二天到来时,将创建具有当前日期的新文件,并将所有日志附加到新文件中。根据翻转策略配置,可以保留或删除前一天的文件。 max
和 min
属性控制文件模式中带有 %i
说明符以维护文件计数器和 fileIndex
以控制文件重命名的文件数。
原创
<块引用>%d 参数表示一个新的日志文件 test.log 附加了 当前 {yyyy-MM-dd} 每天都会创建?以前的版本 test.log 没有删除?如果我将 %d 更改为 %M 应该创建一个新文件 每月创建?
%d
是转换说明符 - Log4j 2 具有用于不同转换说明符的转换器。 %d
指的是日期并允许您发送日期格式。日期时间单位本身控制翻转发生的时间。 %m
在 log4j2 中无法识别,而您每个月都会使用 %d{yyyy-MM}
创建文件。您可以使用 modulate
标志在间隔边界处滚动文件 - 月初。
为了确保只有当天的日志文件可用并且 如果将策略修改为:
,则删除其他日志文件是的,这是正确的。 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
天。
其次,您可以激活(默认为 false
)modulate
参数。此参数指示是否应调整间隔以使下一次翻转发生在间隔边界上。 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>
使用此功能时的模式。