Time based triggering policy in log4j2

两盒软妹~` 提交于 2019-11-30 02:26:56

1 here indicates 1 day and not 1 hour. I have manually tested with below configuration.

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

For manual testing, I change the system date and time. First, try with increasing 1 hour. The log files will be generated but not as per the expectation. Then change the system date, increase by 1 day and then see the results.

Suppose the last log file (abc.log) on day 29-Oct is of 50 KB. Configuration size is 100 KB. If we change the day (increase by 1 day) and then run. Then, last file will be renamed 29-Oct-(some sequence number).log (50 KB file as it is copied) and new file will be created with abc.log

I have tried this with simple servlet with below configuration in web.xml

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

keep log4j2.xml in src folder. log4j2.xml is not loaded if we keep it in classpath.

As Abid mentioned, interval value is interpreted in context of pattern that is specified as part of filePattern. It starts with lowest denomination. For example,if pattern contains S, frequency will be in millisecond. It supports the date pattern as described in detail as part of SimpleDateFormat java doc http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Log4j documentations:

interval -> (integer) How often a rollover should occur based on the most specific time unit in the date pattern. For example, with a date pattern with hours as the most specific item and and increment of 4 rollovers would occur every 4 hours. The default value is 1.

You should change the filename pattern if you would like to create it every hour.

You do have a non-empty log file (otherwise there is nothing to roll over)?

Note that even though the name is "TimeBased..." It will not actually roll over at the specified time, but at the first log event that arrives after the time threshold has been exceeded. Can you try with a small test program that logs something after 61 minutes or so and see if the problem still occurs?

If it doesn't roll over with the above test program, you may have found a bug. In that case please raise it on the log4j issue tracker. (Be sure to attach the test program the team can use to reproduce the issue).

According to your TimeBasedTriggeringPolicy configuration, logger will only populate the logs every day not every hour. AFAIK,You can achieve the functionality by changing the filePattern from HH(Hours) to dd(Days).

I have modified your config.xml. Try This

<?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>

For more details check this

Hope this will workout for you too.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!