java log4j微秒精度

v1l68za4  于 2023-08-02  发布在  Java
关注(0)|答案(2)|浏览(126)

我使用log4j向ElasticSearch发送消息,使用Socket appender和PatternLayout,如下所示:

<PatternLayout pattern="{&quot;time&quot;: &quot;%d{DEFAULT_MICROS}&quot;, &quot;message&quot;: &quot;%msg&quot;}%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?我们能让它使用更现代的时间框架吗?

k97glaaz

k97glaaz1#

我对你的问题感到困惑,它实际上看起来像你得到微秒精度848000(6位数)?

  • 一到三个十进制数字(毫秒)。
  • 四到六位十进制数字(微秒)。
  • 七到九个十进制数字(纳秒)。

Log4j似乎为您正常工作。如果你想要更高的精度,你可以更改为DEFAULT_NANO。

Pattern Layout
PatternLayout has additional options for the %d date format specifier:

%d{DEFAULT_MICROS} - e.g. 2012-11-02 14:34:02,123456
%d{DEFAULT_NANOS} - e.g. 2012-11-02 14:34:02,123456789
%d{ABSOLUTE_MICROS} - e.g. 14:34:02,123456
%d{ABSOLUTE_NANOS} - e.g. 14:34:02,123456789
%d{HH:mm:ss,nnnn} to %d{HH:mm:ss,nnnnnnnnn} - e.g. 14:34:02,1234 to 
14:34:02,123456789
%d{dd MMM yyyy HH:mm:ss,nnnn} to %d{dd MMM yyyy HH:mm:ss,nnnnnnnnn} - 
e.g. 02 Nov 2012 14:34:02,1234 to 02 Nov 2012 14:34:02,123456789

字符串

w1e3prcc

w1e3prcc2#

log4j-core工件是Multi-release JAR file,JDK 8和JDK 9+版本中提供的唯一类是PreciseClock实现。JDK 8版本基于System.currentTimeMillis(),具有毫秒精度。改进的JDK 9+版本基于Clock.instant(),具有更好的精度。
您应该检查您的系统是否支持多版本jar。失去MR支持的最常见方式是将所有jar文件隐藏为一个,但问题也可能来自应用服务器:较旧的应用程序服务器(2017年之前)在其类加载器中缺乏多版本支持。

相关问题