4

パッケージの一部として Log4perl を使用して、特定の DBI 接続が何をしているかをキャプチャしています。私の現在の計画は、 を介して、接続ごとに新しいロガー オブジェクトを作成することですLog::Log4perl->get_logger($mysql_connect_id)。これにより、さまざまな接続が互いに台無しにすることなく、異なるファイルまたは同じファイルに書き込むことができるようになります。

私の懸念は、接続が切断され、そのロガーが不要になったときに何が起こるかということです。Log4perl がこれらのロガーを無期限に保持するだけの場合、メモリ リークのレシピのように思えます。

ロガーが役に立たなくなったと確信した後、ロガーを取り除く最良の方法は何ですか? あるいは、逆に、これは問題でもありますか? Log4perl には、この種のリークを既に防止する何らかの組み込みの処理メカニズムがありますか?


編集: 質問のコメントで言及されていますが、おそらくここで言及する価値があります: Log::Log4perl::Logger にはDESTROY有望と思われる方法があります。ただし、それは文書化されておらず、「文字列 eq で初期化されていない値を使用しています」という警告が大量にスローされるため、注意が必要です。ハックのように感じます。(しかし、それが最善/唯一の方法である場合、「特定のパッケージからの特定の警告をオフにするにはどうすればよいですか?」という質問になると思います)

4

4 に答える 4

5

私が見る唯一の方法は、の内部キャッシュを操作することですLog::Log4perl::Logger

delete $Log::Log4perl::Logger::LOGGERS_BY_NAME->{$category};

これは、Log::Log4perl の現在のバージョンで動作するという点で「安全」ですが、アップデートで壊れる可能性があるという点で安全ではありません。これは以前に別の SO ユーザーによって提案されましたが、削除されました。

API の一部として個々のキャッシュ エントリを削除する機能をリクエストすることをお勧めします。それを早めたい場合は、パッチを提出してください。それはかなり簡単です。

于 2011-05-09T07:01:16.710 に答える
3

遅れて申し訳ありませんが、ようやく修正されたと思います。新しく実装されたメソッドを使用して、未使用のロガーを削除できるようになりました(保持している rLog::Log4perl->remove_logger($logger)の残りの参照を削除することを忘れないでください)。$logge

githubにチェックインし、次のリリース (1.33) で公開する必要があります。これを知らせてくれてありがとう。log4perl 担当のマイクです。

于 2011-05-22T06:29:39.383 に答える
2

のように見えます

Log::Log4perl::Logger->cleanup();

呼び出しは、これまでに初期化されたすべてを削除する必要があります。関連するリソースをすべて削除する必要があります。

于 2011-05-06T17:26:37.863 に答える
0

http://search.cpan.org/dist/Log-Log4perl/lib/Log/Log4perl.pmのドキュメントから:

システムからロガーを削除するには、Log::Log4perl->remove_logger($logger) を使用します。残りの参照 $logger がなくなると、ロガーは自己破壊します。問題のロガーがステルス ロガーの場合、その便利なショートカット (DEBUG、INFO など) はすべて no-ops になります。

于 2011-12-02T10:07:24.927 に答える