log4j2 中基于时间的触发策略

2022-09-01 12:50:25

我正在尝试每小时创建新的日志文件。我正在RollingFileAppender中使用Lo4j2的TimeBasedTriggerringPolicy。以下是我从log4j2官方网站获取的示例xml配置代码。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
   <Appenders>
      <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
         <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
         </PatternLayout>
         <Policies>
            **
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            **
            <SizeBasedTriggeringPolicy size="250 MB" />
         </Policies>
      </RollingFile>
   </Appenders>
   <Loggers>
      <Root level="error">
         <AppenderRef ref="RollingFile" />
      </Root>
   </Loggers>
</Configuration>

在间隔属性中,我设置了 1,表示 1 小时。但是我的文件仍然不会每1小时滚动一次。

请帮我找到任何错误。

注意:我已经包含了log4j2的beta9(这是最新的)


答案 1

此处的 1 表示 1 天,而不是 1 小时。我已使用以下配置手动测试。

<RollingFile name="T" fileName="/data_test/log/abc.log"
        filePattern="/data_test/log/abc-%d{MM-dd-yyyy}-%i.log">
        <PatternLayout>
            <Pattern>%d{ISO8601} %-5p [%t] (%F:%L) - %m%n</Pattern>
        </PatternLayout>
        <Policies>              
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            <SizeBasedTriggeringPolicy size="100 KB" />
        </Policies>
    </RollingFile>

对于手动测试,我更改了系统日期和时间。首先,尝试增加1小时。将生成日志文件,但不会按照预期生成。然后更改系统日期,增加1天,然后查看结果。

假设 10 月 29 日的最后一个日志文件 (abc.log) 为 50 KB。配置大小为 100 KB。如果我们改变日期(增加1天),然后运行。然后,最后一个文件将被重命名为29-Oct-(某些序列号).log(复制时为50 KB文件),并将使用abc创建新文件.log

我已经在Web中用简单的servlet尝试了这一点,并具有以下配置.xml

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>

将 log4j2.xml 保留在 src 文件夹中。log4j2.xml 如果我们将其保存在类路径中,则不会加载它。


答案 2

Log4j 文档

间隔 ->(整数) 根据日期模式中最具体的时间单位,滚动更新发生的频率。例如,使用以小时为单位的最具体项且递增 4 次翻转的日期模式将每 4 小时发生一次。默认值为 1。

如果要每小时创建一次文件名模式,则应更改它。


推荐