使用 Log4j2 2.11 的微秒级打印分辨率

Microseconds print resolution with Log4j2 2.11

我遇到了一个最奇怪的问题,即日志记录的微秒时间分辨率在某些情况下无法正常工作,而在其他情况下却可以正常工作。

设置说明:

这是 Log4j2 XML 配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" shutdownHook="disable">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%d{yyyy-MM-dd'T'HH:mm:ss,nnnnnn} [%t] %level{length=5} %c{1} -%equals{ |%marker|}{ ||}{} %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

当我 运行 通过 ./gradlew clean bootRun 手动设置时,我得到了完美的 us 分辨率。

但是,当我将文件打包到 "fat" spring 引导 jar 时(通过 ./gradlew clean bootJar 然后 运行它,我只得到毫秒级别的几分之一秒。

当然,log4j2.xml 文件已正确打包为 spring 引导 jar 的一部分。

我猜它在某种程度上与类路径问题有关,但看在上帝的份上,我不明白是什么导致了这种行为。

任何 help/suggestions 都会得到很多建议。

关注log4j documentation

One 2.11 feature worth highlighting is that log timestamps can now have microsecond or nanosecond precision when running on Java 9.

您确定,在这两种情况下,您的应用 运行 在同一个 JRE 下是什么?

Log4j API 和实现 jar 打包为 multi-release jar。 JDK 设计师以其无穷的智慧忽略了这一点,如果您将 jar 包装在另一个没有 multi-release: true 清单 header 的 jar 中。否则,您将无法执行 Log4j 中内置的任何 Java 9+ 支持。

底线是 - 添加 multi-release: true header 到 Spring 引导应用程序 jar 清单。

更新:尽管@rgoers 在他的观察中在技术上是正确的,但将多版本标志添加到清单中没有解决问题。事实证明这是工作中的 spring boot 2 问题,现在已通过 Spring boot 2.1.2 解决(甚至可能在 2.1.1 上)。

日志记录现在可以正常运行,无需更改清单。

可以在此处找到其他信息 - https://github.com/spring-projects/spring-boot/issues/12523