log4j2中基于时间的触发策略

时间:2013-10-10 19:05:55

标签: java logging configuration 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>

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

请帮我找错。

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

6 个答案:

答案 0 :(得分:21)

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天,然后查看结果。

假设第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>

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

答案 1 :(得分:5)

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

的一部分

答案 2 :(得分:4)

Log4j documentations

  

间隔 - &gt; (整数)基于最大值进行翻转的频率   日期模式中的特定时间单位。例如,带有日期   模式以小时为最具体的项目,增量为4   翻车每4个小时就会发生一次。默认值为1.

如果您想每小时创建一次,请更改文件名模式。

答案 3 :(得分:2)

你有一个非空的日志文件(否则无法翻转)?

请注意,即使名称为“TimeBased ...”,它也不会在指定时间实际翻转,而是在超过时间阈值后到达的第一个日志事件。你可以尝试一个小的测试程序,在61分钟左右后记录一些东西并查看问题是否仍然存在?

如果上述测试程序没有翻身,您可能发现了一个错误。在这种情况下,请在log4j问题跟踪器上提出它。 (请务必附上团队可用于重现问题的测试程序。)

答案 4 :(得分:0)

根据您的TimeBasedTriggeringPolicy配置,记录器只会每天而不是每小时填充一次日志。 AFAIK,您可以通过将filePattern从HH(Hours)更改为dd(Days)来实现此功能。

我修改了您的config.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}-%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>

有关更多详细信息,请检查this

希望这也将为您锻炼身体。

答案 5 :(得分:0)

时间间隔解释取决于您使用的文件模式。以下配置为我每秒滚动文件。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
            <Console name="A" target="SYSTEM_OUT">
                    <PatternLayout pattern="%d [%t] %-5p {%F:%L} %x - %m%n" />
                    <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Console>

            <RollingFile name="R"
                    fileName="/home/xxx/yyy/myapp.log" filePattern="/home/xxx/yyy/myapp-%d{yyyy-MM-dd-HH-mm-ss}-%i.log">
                    <PatternLayout pattern="%d [%t] %-5p {%F:%L} %x - %m%n" />
                    <Policies>
                            <TimeBasedTriggeringPolicy interval="1" />
                    </Policies>
            </RollingFile>
    </Appenders>


    <Loggers>
            <Root level="INFO">
                    <AppenderRef ref="A" />
                    <AppenderRef ref="R" />
            </Root>
    </Loggers>
</Configuration>