6

私のlog4j.xml内容:

<appender class="org.jboss.logging.appender.RollingFileAppender" name="rm">
  ...
  </layout>

ログファイルに、順序が正しくないタイムスタンプが表示されます。タイムスタンプに基づいて表示できますか?

2009-02-19 14:47:01,288デバッグ[com.catalystwms.core.persistence.TransactionContext]  
2009-02-19 14:54:27,429情報[com.catalystwms.tms.services.background.purge.PurgeManager]  
2009-02-19 14:47:01,288デバッグ[com.catalystwms.core.services.ServiceLocator]

私を助けてください。

ありがとう、

4

5 に答える 5

5

異なるスレッドで発生する 2 つのログ ステートメントです。

(スレッド 1) 2009-02-19 14:54:27,429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager]
(スレッド 2) 2009-02-19 14:47:01,288 DEBUG [com.catalystwms. core.services.ServiceLocator

ログ ステートメント time は、イベントが発生した時刻を正確に示していると思いますが、スレッド 2 がロックの取得を待機しているため、順不同で書き込まれているだけです。アペンダーを org.apache.log4j.AsyncAppender でラップすると、問題が解決するはずです。

于 2009-02-25T17:11:55.307 に答える
1

ローリングアペンダーを使用して同じログファイルにログを記録する2つの異なるプロセスがあります。Log4jはこれを許可していません。appname-server1.log以前は、サーバー名をログファイルに追加することで、クラスター化されたWebアプリでこれを解決しました。appname-server2.log各サーバーは、独自のログに書き込むように構成されています。

これは、あるマシンの構成と別のマシンの構成に固有のバグを追跡する場合にも役立ちます。

上記のすべては、実行中のアプリケーションに基づいてファイルに名前を付けることにより、同じログファイルに書き込む2つの異なるアプリケーションがある場合にも機能します。

于 2009-02-25T18:45:45.537 に答える
0

@andy への応答:
(スレッド 1) 2009-02-19 14:54:27,429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager]
(スレッド 2) 2009-02-19 14:47:01,288デバッグ [com.catalystwms.core.services.ServiceLocator

私が考えているのは、スレッド 2 が書き込みを試みるときに 14:47:01,288 に logRecord を作成することです。ロガーのアペンダーのリストのロックを取得する必要がありますが、別のスレッドがロックを保持しており、IO の実行でビジーです。 2待ち。スレッド 1 は 14:54:27,429 に logRecord を作成し、同じロックを取得しようとし、待機します。ロックが解放されると、OS はそれをスレッド 1 に渡し、印刷します。

これが本当なら、もう 1 つの大きな問題はパフォーマンスの問題です。ロギング IO でコード パスがブロックされる可能性がありました。

于 2009-02-25T19:05:25.347 に答える
-1

ログが書き込まれる前に、おそらく修正することはできません。書き込みごとに log4J を変更して .flush() を呼び出すこともできますが、それによりコードがかなり遅くなり、@Chris Nava のソリューションがより適切になります。

于 2009-02-25T18:22:27.963 に答える