[
https://issues.apache.org/jira/browse/LOG4J2-3195?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jean-Luc VANNIERE updated LOG4J2-3195:
--------------------------------------
Attachment: ExtendedDatePatternConverter.java
TimeZoneAdapter.java
> Discrepancy between threads upon default timezone changing.
> -----------------------------------------------------------
>
> Key: LOG4J2-3195
> URL: https://issues.apache.org/jira/browse/LOG4J2-3195
> Project: Log4j 2
> Issue Type: Bug
> Components: Appenders
> Affects Versions: 2.13.3
> Reporter: Jean-Luc VANNIERE
> Priority: Major
> Attachments: ExtendedDatePatternConverter.java, TimeZoneAdapter.java
>
>
> Let's consider the following use case:
> * Start a process with the following layout in the console appender
> (<PatternLayout pattern="{*}%d\{yyyy-MM-dd HH:mm:ss.SSSZ}{*} %-5p %c (%t)
> %m%n"/>
> * Initialize the logs in a given timezone (eg: Europe/Paris so GMT+0100)
> * Log something in a thread #1,
> {color:#0747a6}logger.info("Before TimeZone switch") --> {color}
> {color:#0747a6}2021-11-22 19:32:09.533+0100 INFO
> com.calypso.log.timezone.TestTZ (thread1) Before TimeZone Switch{color}
> * Change the defaut timezone (eg to America/New_York so GMT-0500)
> * Log something in another thread #2 which has never log so far
> {color:#0747a6}logger.info("After TimeZone switch") --> {color}
> {color:#0747a6}2021-11-22 13:32:09.534-0500 INFO
> com.calypso.log.timezone.TestTZ (thread2) After TimeZone Switch{color}
> * Log something in thread #1
> {color:#0747a6}logger.info("After TimeZone switch") --> {color}
> {color:#0747a6}2021-11-22 19:32:09.535+0100{color} INFO
> com.calypso.log.timezone.TestTZ (thread1) After TimeZone Switch
> Thread #1, and any other thread that has logged before the default TimeZone
> switch, will continue to log in the previous time zone.
> Thread #2 (and any other thread that has not logged priror to the time zone
> switch), will log in the new time zone.
> And some of our customers are complaining about this discrepancy which cause
> their logs to switch constantly between 2 time zones.
> The root cause of this issue is due to the fact that (in
> DatePatternConverter.formatWithoutAllocation()) the DatePatternConverter
> records the formatter into a thread-local and this formatter contains the
> timezone at the moment of its creation. In other words, the first time the
> thread logs, it creates the formatter with the current timezone and records
> it into a thread local storage for further reuse. The problem is that if the
> default timezone change afterwards this latest is ignored by the thread.
> A solution would be either not recording the timezone when no timezone is
> given to the logging, either providing an adapter which extends TimeZone and
> delegates systematically to the current default timezone (as bellow in
> DatePatternConverter). That way the date formatter would always use the
> current default time zone.
> {code:java}
> private static Formatter createNonFixedFormatter(final String[] options) {
> ....
> // if the option list contains a TZ option, then set it.
> TimeZone tz = null;
> if (options.length > 1 && options[1] != null) {
> tz = TimeZone.getTimeZone(options[1]);
> }
> else {
> tz = new TimeZoneAdapter(); // set tz to adapter
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)