1

私はJavaアプリケーションを持っています。ログフォーマッタオブジェクトを使用しています。すべてのログメッセージにこのオブジェクトが必要です。例えば

log.debug(new LogFormatter(x,y,z))

ただし、ログに記録するすべての新しいLogFormatterオブジェクトを作成する必要があります。たとえば静的な方法を使用する場合

log.debug(LogFormatter.format(x,y,z))

新しいオブジェクトを作成する必要はありません。しかし、マルチスレッドアプリケーションでは、正しく機能します。

2つのスレッドがdiff値で呼び出すと、ロギングが台無しになります。

または、スレッドローカルが最善の方法です

4

4 に答える 4

1

これは、ロガーの実装によって異なります。synchronizeネイティブJavaクラスを使用する場合は、ログ挿入を処理するメソッドまたはコードセクションのキーワードを使用してロックを処理する必要があります。

IMOスレッドセーフなLog4Jのようなログライブラリを使用することをお勧めします。

JBossやGlassFishなどの一部のJavaアプリケーションサーバーは、Log4jを使用してロギング作業を処理することに注意してください。

于 2012-10-12T14:39:33.320 に答える
1

私は使うだろう

private final LogFormatter logFormatter; // immutable object.

log.debug(logFormatter.format(x,y,z))

フォーマッタは不変であるため、共有できます。

于 2012-10-12T14:40:22.190 に答える
0

それは2つのことに依存します:

  1. LogFormatter.format(x,y,z)メソッドがスレッドセーフかどうか。
  2. ロガーの実装がスレッドセーフかどうか。

これらの2つの条件が当てはまる場合は、マルチスレッド環境でスキームを使用でき、エラーは発生しません。

具体的には、ロガーの実装は、基になる出力メカニズムへのアクセスを同期するという意味でスレッドセーフである必要があります。たとえば、一度に1つのログレコードのみが出力されるようにします。

于 2012-10-12T14:41:21.473 に答える
0

ロギングがオンの場合にのみスレッド間の同期を回避するために、スレッドごとに1つのログチェーンを関連付けるために使用されます。難しいのは、何が起こっているのかを理解するために、いくつかのファイルをオフラインで結合することです。ログの各行には、日付とスレッドIDがあります。

于 2012-10-12T14:51:18.410 に答える