我有一个 log4j 时间戳格式问题,任何帮助将不胜感激。
使用
JsonTemplateLayout
和以下 xml 配置,我正在尝试实现时间戳格式,但没有成功:
2020-02-07T13:38:47.098+02:00
(注意 +02:00 处的 :
字符):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="ConsoleJSONAppender" target="SYSTEM_OUT">
<JsonTemplateLayout eventTemplateUri="classpath:log4j2.json"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.my.logger" additivity="false" level="debug">
<AppenderRef ref="ConsoleJSONAppender"/>
</Logger>
</Loggers>
</Configuration>
根据Timestamp Resolver手册默认格式是我需要的格式, 但解析后的格式是这样的:
2020-02-07T13:38:47.098+0200
。 (注意 +0200 处缺少的冒号字符)
以下是我的 eventTemplate JSON 的片段,使用默认格式并生成上述格式。
"timestamp": {
"$resolver": "timestamp"
}
使用
FixedDateFormat.FixedFormat枚举的
ISO8601_OFFSET_DATE_TIME_HHCMM
也会导致在 +02:00:没有
:
的格式
"timestamp": {
"$resolver": "timestamp",
"format": "%d{ISO8601_OFFSET_DATE_TIME_HHCMM}"
}
奇怪的是,使用
ISO8601_OFFSET_DATE_TIME_HHCMM
中的格式 yyyy-MM-dd'T'HH:mm:ss,SSSXXX
,我得到异常:
Unable to invoke factory method in class org.apache.logging.log4j.layout.template.json.JsonTemplateLayout for element JsonTemplateLayout:
java.lang.IllegalStateException:
No factory method found for class org.apache.logging.log4j.layout.template.json.JsonTemplateLayout java.lang.IllegalStateException:
No factory method found for class org.apache.logging.log4j.layout.template.json.JsonTemplateLayout
"timestamp": {
"$resolver": "timestamp",
"pattern": {
"format": "yyyy-MM-dd'T'HH:mm:ss,SSSXXX",
"timeZone": "UTC"
}
}
[
IllegalStateException
是由于版本2.15.0中引入并在2.19.0中解决的错误(参见LOG4J2-3614)。升级到2.20.0版本摆脱它]
Log4j2 使用多种日期格式化程序:Apache Commons 的
FastDateFormat
、Log4j 的FixedDateFormat
(第一个的优化版本)和 Java 的DateTimeFormatter
.
默认的JSON Template Layout为
yyyy-MM-dd'T'HH:mm:ss.SSSZZZ
,其中时区部分解释为:
FastDateFormat
DateTimeFormatter
.由于版本 2.15.0 中的一些更改,模式的语义从
FastDateFormat
切换为 DateTimeFormatter
。我已将其报告为Github问题#1420。
要保持以前的行为,您需要使用:
"timestamp": {
"$resolver": "timestamp",
"pattern": {
"format": "yyyy-MM-dd'T'HH:mm:ss.SSSxxx"
}
}
XXX
模式将输出 Z
而不是 +00:00
.