【问题标题】:Default log4j policy默认 log4j 策略
【发布时间】:2021-05-05 16:24:50
【问题描述】:

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

对于以下配置:

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

这是否正确:

%d 参数表示每天都会创建一个附加了当前{yyyy-MM-dd} 的新日志文件 test.log ?以前版本的 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>

?

【问题讨论】:

  • 您是否希望没有翻转策略/触发策略?只保留今天的文件?
  • @s7vr 我应该说,我只是想了解我遇到的一些配置。我不知道上述配置的预期结果是什么,据我所知,我已经分享了,我请求确认我的理解
  • 谢谢 - 我已经添加了答案。我可以根据您的反馈进一步扩展答案。
  • 不必回复我的评论。如果您可以选择其他赏金答案的原因可能是什么 - 只是为了我的理解,以便我将来可以提供更好的答案。还注意到您不接受答案。也许您正在寻找更多信息?
  • @s7v4 抱歉,我试图拆分赏金,但一旦获得奖励,我就无法编辑。

标签: java spring logging log4j slf4j


【解决方案1】:

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

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

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

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

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

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

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

对于TimeBasedTriggeringPolicy,您可以配置几个参数来确定日志翻转行为,主要是两个。

首先,您有interval 参数:它将指示基于日期模式中最具体的时间单位 应该多久发生一次翻转。即,如果像您的示例一样,您将天配置为最具体的单位并为interval 参数提供3 的值(默认为1),则翻转将每隔3 天发生一次。

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

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

p>

在您的用例中会出现类似的情况,但语义是一年中的某一天。

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

关于日志删除,据我所知,如果您在模式中使用数字索引(通过调整 fileIndexmin 结束 max 参数),默认翻转策略只会删除旧文件,但是,从 Log4j 2.5 开始,您可以使用 delete action 在发生日志翻转时执行基于日期/时间的日志的清理(在 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 模式您使用此功能。

【讨论】:

  • 非常感谢@blue-sky 的赏金。我希望答案是有帮助的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2019-10-15
    • 2020-06-14
    相关资源
    最近更新 更多