私が使用しているシステムの簡単な説明から始めましょう。
デーモンとして実行されるシステムがあり、ワークユニットが入ってくると実行されます。このデーモンは、新しいワークユニットが与えられると、新しいスレッドを動的に作成します。これらの作業単位ごとに、追加する新しいログ ファイルを作成する Log4J が必要です。ファイル名は、新しいログ ファイルを作成する必要がある実行時に提供されます。このデーモンは無期限に生き続けることができなければならず、後で説明するように、これがメモリの問題を引き起こすと私は信じています。
私が最初に考えたのは、ワークユニットごとに新しいロガーを作成し、もちろんスレッドにちなんで名前を付けることでした。ワークユニットのスレッドは、そのロガーへの参照を保持します。ユニットが終了すると、ガベージ コレクションが行われますが、問題は、Log4J 自体が Logger への参照を保持し、二度と使用されないことです。これらすべての Logger が原因で VM のメモリが不足する可能性があります。
別の解決策: Filter をサブクラス化し、Appender をスレッド名でフィルタリングし、それらを同じ Logger に配置します。次に、ワークユニットが完成したらアペンダーを削除します。もちろん、これにはアペンダーを削除するコードを追加する必要があります。それは多くのコード変更になります。
同じファイルへのインターリーブ出力を管理することを目的としているように見える NDC と MDC を調べました。これを解決策として提案することを検討しましたが、受け入れられるとは思いません。
Log4Jは、このように機能すること、つまり、必要な (または望ましい) ときに実行時に新しいログ ファイルを動的に作成することを意図していないように見えると言いたいです。したがって、次にどの方向を見ればよいかわかりません-log4jはここでの解決策ではありませんか、それとも完全に何かを見逃しましたか? NDC を十分に詳しく調べていませんか? それとも、Log4J が Loggers を保持しているという私の懸念は、理由がわかりませんが問題ではありませんか?