Log4J2: JsonTemplateLayout时间戳格式问题

问题描述 投票:0回答:1

我有一个 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"
    }
  }
java json log4j
1个回答
0
投票

[

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
,其中时区部分解释为:

  • 符号 + 2 位数字 + 冒号 + 2 位数字 by
    FastDateFormat
  • sign + 4 位数字 by
    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
.

© www.soinside.com 2019 - 2024. All rights reserved.