1

プロジェクトのロギングを改善するために log4j 2 を試しています。毎日ログ ファイルを作成する RollingFile アペンダーを使用しています。

<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) によるスレッドの再利用に関係しています。

リクエスト自体のミリ秒を取得できるように、これを回避する方法はありますか?

4

1 に答える 1

1

%r は、必ずしもレイアウトが作成されたときではなく、JVM が開始されてからのミリ秒数を表します。値は、ManagementFactory.getRuntimeMXBean().getStartTime(); を呼び出して計算されます。パターン コンバーターが作成されたときに、各イベントの開始時刻の値からイベント タイムスタンプを減算します。あなたが説明しているように、開始時間が決して変わらないことを考えると、この値は時間の経過とともに大きくなるはずです。

Log4j には、リクエストが開始された時刻を取得する方法がありません。それを ThreadContext 値でキャプチャし、独自のパターン コンバーターを作成して、その値を現在のシステム時刻から減算する値として使用できます。

于 2016-02-01T17:16:34.463 に答える