log4j 2 中的 %r 模式能否与 Java 应用程序服务器 (Payara4.1) 结合使用?

Can %r pattern in log4j 2 be correctly used in combination with Java application servers (Payara4.1)?

我正在试用 log4j 2 来改进我项目中的日志记录。我正在使用每天创建一个日志文件的 RollingFile appender。

<Configuration status="DEBUG">
<Properties>
    <Property name="log-path">D:/logs/</Property>
</Properties>
<Appenders>
    <RollingFile name="RollingFile" fileName="${log-path}/daily.log"
                 filePattern="${log-path}/daily_%d{yyyy-MM-dd}.log" >
        <PatternLayout>
            <pattern>%-5level: %d{HH:mm:ss,SSS} - %c{1}::%M -  [%X{username}] %m [%r]%n</pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1"/>
        </Policies>
    </RollingFile>
    <Console name="STDOUT" target="SYSTEM_OUT">
        <PatternLayout pattern="%-5level: %d{HH:mm:ss,SSS} - %c{1}::%M - [%X{username}] %m [%r]%n"/>
    </Console>
</Appenders>
<Loggers>
    <Logger name="root" level="debug" additivity="false">
        <appender-ref ref="RollingFile" level="debug"/>
    </Logger>
    <!-- Change logging level below. Accepted values: error, warning, info, debug, trace -->
    <Root level="debug" additivity="false">
        <AppenderRef ref="RollingFile"/>
        <AppenderRef ref="STDOUT"/>
    </Root>
</Loggers>
</Configuration>

现在我有一个关于 %r 模式的问题。这应该表示从构建布局到创建日志事件所经过的毫秒数。

当我 运行 这个时候,我注意到毫秒数太高了,而且数量还在增加。这与 Java 应用程序服务器(在我的例子中是 Payara 4.1)对线程的重用有关。

有没有办法解决这个问题,以便我可以获得请求本身的毫秒数?

%r代表JVM启动后的毫秒数,不一定是Layout创建时。该值是通过调用 ManagementFactory.getRuntimeMXBean().getStartTime(); 计算得出的;当创建模式转换器时,然后从每个事件的开始时间值中减去事件时间戳。鉴于开始时间永远不会改变,这个值应该像您描述的那样随着时间的推移而增长。

Log4j 无法获取请求开始的时间。您可以在 ThreadContext 值中捕获它,然后创建您自己的模式转换器以将该值用作从当前系统时间中减去的值。