*Abstract:* Log4j contains two custom date & time formatting classes. All
our competitors (Logback
<https://github.com/qos-ch/logback/blob/master/logback-core/src/main/java/ch/qos/logback/core/util/CachingDateFormatter.java>,
Tinylog
<https://github.com/tinylog-org/tinylog/blob/7590ad150b1523691ae6f26ae24a291b81d804c9/tinylog-api/src/main/java/org/tinylog/runtime/PreciseTimestampFormatter.java>,
etc.) use Java's `DateTimeFormatter` and I know of no user complaints about
their performance issues. Shall we switch to `DateTimeFormatter` as the
default in the next minor release and make the custom implementations
opt-in?
Log4j ships two custom date & time formatting classes:
- `FixedDateFormat`
- Supports a hardcoded list of formats
- Bug: Conflates `n` directive with `S`
- Bug: It cannot calculate DST correctly for all time zones
<https://github.com/apache/logging-log4j2/issues/2943>
- `FastDateFormat`
- Copied from Commons Lang in 2015
I recently ran a test comparing the output of these with
`DateTimeFormatter` – the difference is *big*! I can spend months fixing
these issues, but... Do we really need them?
1. No other competitors have such an optimization (both Logback
<https://github.com/qos-ch/logback/blob/master/logback-core/src/main/java/ch/qos/logback/core/util/CachingDateFormatter.java>
and Tinylog
<https://github.com/tinylog-org/tinylog/blob/7590ad150b1523691ae6f26ae24a291b81d804c9/tinylog-api/src/main/java/org/tinylog/runtime/PreciseTimestampFormatter.java>
use
`DateTimeFormatter`)
2. Date & time formatting is very fragile (DST is more voodoo than
science)
3. If date & time formatting during logging is found to be the
bottleneck of an application, shouldn't they instead encode it differently,
e.g., encoding epoch numbers?
4. `DateTimeFormatter` performance will only get better over time
Hence, I propose switching all layouts to use `DateTimeFormatter`, unless
the `log4j.time.legacyFormatterEnabled` property is provided. Objections?
Note that the caching optimization we have for the last formatted timestamp
will stay untouched.