Volkan, I was able to get the test case you supplied running in JsonTemplateLayoutTest. I confirm that it passes on my system as well. In fact, all the tests in `log4j-layout-template-json` at `rel/2.14.1` pass (except JsonTemplateLayoutGcFreeTest, which I'm willing to believe is a quirk of that test vis-a-vis my setup). That tells me that log rendering in unit-test isolation operates as expected.
I extended the test case to use SystemClock to generate two Instants with a short pause between generation, like: ``` final Clock systemClock = new SystemClock(); final MutableInstant instant3 = new MutableInstant(); instant3.initFrom(systemClock); try { Thread.sleep(100); } catch (InterruptedException e) {}; final MutableInstant instant4 = new MutableInstant(); instant4.initFrom(systemClock); final LogEvent logEvent3 = Log4jLogEvent.newBuilder().setInstant(instant3).build(); final LogEvent logEvent4 = Log4jLogEvent.newBuilder().setInstant(instant4).build(); usingSerializedLogEventAccessor(layout, logEvent3, accessor3 -> { usingSerializedLogEventAccessor(layout, logEvent4, accessor4 -> { Long epoch3 = accessor3.getObject("timestamp.epoch", Long.class); String iso3 = accessor3.getString("timestamp.iso8601"); Long epoch4 = accessor4.getObject("timestamp.epoch", Long.class); String iso4 = accessor4.getString("timestamp.iso8601"); assertThat(epoch4 - epoch3).isGreaterThanOrEqualTo(100L); assertThat(iso3).isNotEqualTo(iso4); }); }); ``` This test portion also passed. This tells me that the act of deriving the time from a provided clock operates as expected. Back in my example application, I did some more experimentation and found the following: - Removing the timestamp pattern resolver from the JSON template does not change behavior. Epoch timestamps continue to be repeated. - Changing the timestamp epoch resolver to use millis or seconds does not change behavior. Epoch timestamps are correctly rounded and rendered, they just don't appear to advance. Seeking to rule out whether this was due to behavior in the logger, I switched to an async logger using Disruptor 3.4.4: - Passing '-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector' does not appear to change behavior. - Using an AsyncLogger does not appear to change behavior. - Changing `log4j2.clock` to use CachedClock (vs SystemClock) does not change behavior. Some precision in the nano timestamp is lost, as I believe is expected. I sought to rule out JDK differences, so I ran my bench application against Azul Zulu 8, 11, and 16, as well as AdoptOpenJDK 11 on J9. No change in behavior between these, the epoch was still repeated between runs. Using a PatternLayout allows both Unix epoch and pattern-derived timestamps to be rendered as expected: ``` <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} - %logger{36} - %msg timestamp=%d{UNIX_MILLIS} %n"/> ``` """ 2021-10-27 18:07:28.111 - example.Log4jApp - Starting count timestamp=1635383248111 2021-10-27 18:07:28.118 - example.Log4jApp - Event 0 timestamp=1635383248118 2021-10-27 18:07:29.123 - example.Log4jApp - Event 1 timestamp=1635383249123 """ I confirmed the behavior of the PatternLayout with an AsyncLogger as well, and it too worked as expected. Please let me know what might be worth trying next here, and thank you for your ideas up to now. I'm quite confused at this point. :) Andrew