log4j2中基于时间的触发策略

use*_*780 17 java configuration logging log4j log4j2

我试图每小时创建新的日志文件.我在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>
Run Code Online (Sandbox Code Playgroud)

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

请帮我发现任何错误.

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

Zub*_*hah 24

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>
Run Code Online (Sandbox Code Playgroud)

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

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

我在web.xml中使用以下配置的简单servlet尝试了这个

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

将log4j2.xml保存在src文件夹中.如果我们将它保存在classpath中,则不会加载log4j2.xml.

  • interval =根据日期模式中最具体的时间单位进行翻转的频率.例如,使用以小时为最特定项目的日期模式,并且每4小时将增加4次翻转.默认值为1.因此,如果您具有类似"yyyy-MM-dd-HH"的模式,则文件将每小时滚动一次,如果它是"yyyy-MM-dd",则文件将每天滚动. (22认同)
  • 我相信,如果您根据日志文件变得大于大小限制(而不是时间)进行滚动,则 %i 将会增加。 (2认同)

Pra*_*ngi 9

每天滚动

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
Run Code Online (Sandbox Code Playgroud)

每日滚动

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd-HH}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
Run Code Online (Sandbox Code Playgroud)

每天5天滚动

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="5" modulate="true" />
Run Code Online (Sandbox Code Playgroud)

每天5小时滚动

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd-HH}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="5" modulate="true" />
Run Code Online (Sandbox Code Playgroud)

每个月滚动

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
Run Code Online (Sandbox Code Playgroud)

希望这些案例能够很好地帮助您理解 filePattern 和间隔之间的关系。


Rem*_*pma 5

您确实有一个非空日志文件(否则没有什么可以滚动)?

请注意,即使名称是“TimeBased...”,它实际上也不会在指定时间滚动,而是在超过时间阈值后到达的第一个日志事件滚动。您能否尝试使用一个小型测试程序,在 61 分钟左右后记录一些内容,看看问题是否仍然出现?

如果上面的测试程序没有成功,你可能发现了一个错误。在这种情况下,请在 log4j 问题跟踪器上提出该问题。(请务必附上团队可以用来重现问题的测试程序)。


raj*_*ish 5

正如Abid所提到的,间隔值在模式的上下文中解释,该模式被指定为filePattern的一部分.它从最低面额开始.例如,如果pattern包含S,则频率将以毫秒为单位.它支持日期模式,详细描述为SimpleDateFormat java doc http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html的一部分.


Ami*_* Sh 5

Log4j 文档

interval->(整数)应基于日期模式中最特定的时间单位进行翻转的频率。例如,对于日期模式,将小时作为最具体的项目,并且每4个小时就会发生4次翻转。预设值为1。

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