Log4j2 2.11的微秒打印分辨率

时间:2019-01-27 17:01:24

标签: java spring-boot timestamp log4j2

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

设置说明:

  • Zulu JDK 11
  • 5.1.1级项目
  • Log4j2 2.11.1依赖项。
  • Spring Boot 2.1.0.RELEASE应用程序

这是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” 弹簧启动jar中(通过./gradlew clean bootJar然后运行它时,我得到的毫秒级分数仅为秒)。

当然,log4j2.xml文件已作为Spring Boot jar的一部分正确打包。

我猜想这与类路径问题有关,但是出于对上帝的爱,我无法理解是什么导致了这种行为。

任何帮助/建议都将得到很多建议。

3 个答案:

答案 0 :(得分:1)

Log4j API和实现jar打包为多版本jar。用他们的无限智慧,JDK设计人员会忽略如果将jar打包在另一个没有multi-release:true清单标头的jar中。否则,您将不会执行Log4j内置的任何Java 9+支持。

最重要的是-将Multi-release:true标头添加到Spring Boot应用程序jar清单中。

答案 1 :(得分:0)

跟随log4j documentation

  

值得一提的2.11功能是,在Java 9上运行时,日志时间戳现在可以具有微秒或纳秒的精度。

您确定两种情况下您的应用程序都在同一JRE上运行吗?

答案 2 :(得分:0)

更新:即使@rgoers从技术上来说是正确的,但在清单中添加多释放标志并不能解决问题。原来这是Spring Boot 2工作中的问题,现在已通过Spring Boot 2.1.2解决(甚至在2.1.1上也可以解决)。

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

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