对于严格的ISO 8601合规性,使Logback在日期和时间之间包含"%"格式的"%"

Bas*_*que 21 java logback

默认情况下,Logback编码器使用类似于ISO 8601标准的日期格式.但它在日期和时间部分之间缺少"T".这使得解析更容易,并且是标准所要求的(除非私人方达成一致).T

是否有一些技巧可以让Logback包含T

这个…

2006-10-20T14:06:49,812
Run Code Online (Sandbox Code Playgroud)

而不是这个......

2006-10-20 14:06:49,812
Run Code Online (Sandbox Code Playgroud)

我想我可以在添加"T"时重新创建整个格式,但我想知道是否有更简单的方法.

Sot*_*lis 45

错误报告

Logback的JIRA页面上有关于此的错误报告.自那以后没有太多的发展24/Feb/10 3:57 PM.我刚刚投票吸引了注意力.你也应该.

我会提供与ISO 8601相匹配的自己的日期格式.

插入"T"

这应该做的伎俩:

<pattern>%d{"yyyy-MM-dd'T'HH:mm:ss,SSS"} [%thread] %-5level %logger{35} - %msg %n
</pattern>
Run Code Online (Sandbox Code Playgroud)

""需要,使,工作的描述文档.

<pattern>元素属于您的Logback配置设置.这是一个示例logback.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <!-- Strangely, Logback lacks a built-in formatter for ISO 8601. So, roll our own.  -->
            <Pattern>%date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC} [%thread] %-5level %logger{36} - %msg%n</Pattern>
        </layout>
    </appender>

    <logger name="com.example" level="TRACE"/>


    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
Run Code Online (Sandbox Code Playgroud)

时区

要更加完全符合ISO 8601标准,并且为了更有用的日志记录,您应该包含时区.

编辑(Michael-O,2014-06-15):事实并非如此,时区是绝对可选的.

要包含时区,请将第二个参数(请参阅doc)传递给%date.传递时区正确名称.避免使用三个或四个字母的时区代码,例如"EST",因为它们既不是唯一的也不是标准化的.例如,通过Australia/Perth.通常,对于日志记录,我们需要UTC(GMT)时间,这意味着没有任何偏移.在那种情况下,通过UTC.

您可以将时区偏移量显示为小时和分钟数,作为日志中日期时间的一部分.附加一个X以显示时区偏移量作为日期时间值的一部分.

这个…

%date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC}
Run Code Online (Sandbox Code Playgroud)

... ...产生

2014-04-16T09:59:24,009Z
Run Code Online (Sandbox Code Playgroud)

XXXJava 7和8中的工作.在早期版本的Java中,您可以使用Z格式定义中的a来生成缺少冒号的偏移号.

  • 我了解到,在该格式的末尾添加Z会提示Logback 1.1.2以+ HHMM(无冒号)格式附加UTC的偏移量。如果将该值设置为UTC,则Logback 1.1.2会附加`+ 0000`(而不是更紧凑的`Z`)。因此,这个%date {“ yyyy-MM-dd'T'hh:mm:ss,SSSZ”,UTC}`会生成此`2014-04-16T09:59:24,009 + 0000`。 (2认同)
  • 另一个调整:使用 `XXX` 而不是 `Z` 渲染带有冒号的 ISO 8601 样式偏移。奖励:对于祖鲁时间(UTC,+00:00),打印“Z”。此功能可能需要 Java 7、8 或更高版本(不确定何时添加)。所以我建议:`%date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC}` (2认同)
  • @ Michael-O严格来说,它们是可选的,是的。但这并不意味着将时区信息排除在外是个好主意。 (2认同)