[
https://issues.apache.org/jira/browse/LOG4J2-2766?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Heiko Schwanke updated LOG4J2-2766:
-----------------------------------
Summary: TimeBasedTriggeringPolicy of RollingRandomAccessFile is not
updated instantly (was: TimeBasedTriggeringPolicy of RollingRandomAccessFile
is not instantly updated)
> TimeBasedTriggeringPolicy of RollingRandomAccessFile is not updated instantly
> -----------------------------------------------------------------------------
>
> Key: LOG4J2-2766
> URL: https://issues.apache.org/jira/browse/LOG4J2-2766
> Project: Log4j 2
> Issue Type: Bug
> Components: Appenders, Configurators
> Affects Versions: 2.13.0
> Reporter: Heiko Schwanke
> Priority: Minor
> Attachments: testcase.zip
>
>
> If a RollingRandomAccessFile is updated with a new TimeBasedTriggeringPolicy
> during runtime, the new value is not updated until the original interval is
> reached once.
>
> E.g. if logging is initialized with the rule to rotate every day and is later
> rerconfigured to rotate every hour, then you have to wait until the next day
> in order to get hourly rotated files.
> This has to do with the ordering in the Update-Method of
> RollingRandomAccessFileManager. Before the new PatternProcessor is created
> the RollingRandomAccessFileManager initializes his TriggeringPolicy from the
> former PatternProcessor.
> org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager:
> {code:java}
> public void updateData(final Object data) {
> final FactoryData factoryData = (FactoryData) data;
> setRolloverStrategy(factoryData.getRolloverStrategy());
> setTriggeringPolicy(factoryData.getTriggeringPolicy()); // ->
> TimeBasedTriggeringPolicy.initialize will use old PatternProcessor
> setPatternProcessor(new PatternProcessor(factoryData.getPattern(),
> getPatternProcessor()));
> }
> {code}
> org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy:
> {code:java}
> public void initialize(final RollingFileManager aManager) {
> this.manager = aManager;
> long current = aManager.getFileTime();
> if (current == 0) {
> current = System.currentTimeMillis();
> } // LOG4J2-531: call getNextTime twice to force initialization of both
> prevFileTime and nextFileTime
> aManager.getPatternProcessor().getNextTime(current, interval, modulate);
> aManager.getPatternProcessor().setTimeBased(true);
> nextRolloverMillis = ThreadLocalRandom.current().nextLong(0, 1 +
> maxRandomDelayMillis)
> + aManager.getPatternProcessor().getNextTime(current, interval,
> modulate); // -> time comes from the old PatternProcessor (see above:
> RollingRandomAccessFileManager.updateData)
> }
> {code}
> See also the attached simple testcase.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)