java - 默认 log4j 策略

标签 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>

最佳答案

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

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

此模式的格式取决于 RolloverPolicyRollingFileAppender 使用.

默认情况下,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也是如此。

关于日志删除,据我所知,如果您在模式中使用数字索引,默认的翻转策略只会删除旧文件(通过调整 fileIndexmin 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/

相关文章:

java - 如何使用 Apache POI 搜索特定日期的 Excel 工作表?

java - 为什么我不能通过 Intent 传递数据?

python - RotatingFileHandler 在遇到错误后不会继续记录

c++ - 用 C/C++ 编写日志文件

java - Apache OpenNLP 词性标注器 : Trained on which data set?

java - Spring:根据配置文件注入(inject)不同的属性文件

java - 服务类和 DAO 类在做同样的事情。为什么你需要他们两个?

java - Spring Security - 具有 IS_AUTHENTICATED_ANONYMOUSLY 但仍指定(且未知)凭据的 Url 被框架阻止

css - 使用 CSS 选择器并在源上不显示

java - 递归构造函数调用 PersonAddress2(String, String, String, String)