我使用log4j向ElasticSearch发送消息,使用Socket appender和PatternLayout,如下所示:
<PatternLayout pattern="{"time": "%d{DEFAULT_MICROS}", "message": "%msg"}%n"/>
字符串
使用%d{DEFAULT_MICROS}
根据documentation获取微秒级精确日期。
但这只给了我毫秒级的精度,就像这样:2023-07-27 15:13:11,848000
(最后3位始终为0)
这个类似的question表明,从Java 9和log4j 2.11.0开始,我们可以获得微秒精度,但我使用的是Java 11和最新的log4j(2.20.0),在Windows Server 2019上运行,只能获得毫秒精度。我错过了什么?
log4j仍然使用SimpleDateFormat?我们能让它使用更现代的时间框架吗?
2条答案
按热度按时间k97glaaz1#
我对你的问题感到困惑,它实际上看起来像你得到微秒精度848000(6位数)?
Log4j似乎为您正常工作。如果你想要更高的精度,你可以更改为DEFAULT_NANO。
字符串
w1e3prcc2#
log4j-core
工件是Multi-release JAR file,JDK 8和JDK 9+版本中提供的唯一类是PreciseClock
实现。JDK 8版本基于System.currentTimeMillis()
,具有毫秒精度。改进的JDK 9+版本基于Clock.instant()
,具有更好的精度。您应该检查您的系统是否支持多版本jar。失去MR支持的最常见方式是将所有jar文件隐藏为一个,但问题也可能来自应用服务器:较旧的应用程序服务器(2017年之前)在其类加载器中缺乏多版本支持。