Утилизация Log4perl Logger, когда он мне больше не нужен - PullRequest
4 голосов
/ 06 мая 2011

Я использую Log4perl как часть пакета для захвата того, что делает конкретное соединение DBI. Мой текущий план состоит в том, чтобы создать новый объект регистратора для каждого соединения через Log::Log4perl->get_logger($mysql_connect_id), который должен позволять различным соединениям записывать либо в разные файлы, либо в один и тот же файл, не портя друг друга.

Меня беспокоит то, что происходит, когда соединение отключено и этот регистратор больше не нужен. Если Log4perl просто хранит эти регистраторы бесконечно, это звучит как рецепт утечки памяти.

Какой лучший способ избавиться от регистратора, если я уверен, что он больше не нужен? Или, наоборот, это даже проблема - есть ли в Log4perl какой-то встроенный механизм удаления, который уже предотвращает такую ​​утечку?


Редактировать: Упоминается в комментариях к вопросу, вероятно, стоит упомянуть здесь: Log :: Log4perl :: Logger имеет DESTROY метод, который кажется многообещающим. Однако он недокументирован и выдает кучу предупреждений «Использование неинициализированного значения в строковом эквалайзере», что вызывает у меня настороженность; это похоже на взлом. (Но если это лучший / единственный способ сделать это, я полагаю, что вопрос звучит так: «Как отключить конкретное предупреждение, исходящее из определенного пакета?»)

Ответы [ 4 ]

5 голосов
/ 09 мая 2011

Единственный способ, которым я вижу, - это манипулировать внутренним кешем Log::Log4perl::Logger.

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

Это «безопасно» в том смысле, что оно будет работать с текущими версиями Log :: Log4perl, но небезопасно в том смысле, что оно может прерваться в обновлении Ранее это было предложено другим пользователем SO, но они удалили его.

Я бы предложил вам сделать запрос функции для возможности удаления отдельных записей кэша как части API. Если вы хотите ускорить его, отправьте патч. Это довольно просто.

3 голосов
/ 22 мая 2011

Извините за задержку, я думаю, что я наконец исправил это сейчас.Теперь вы можете использовать недавно реализованный метод Log::Log4perl->remove_logger($logger) для удаления неиспользуемых регистраторов (не забудьте обнулить оставшуюся ссылку на $logge r, которую вы держите).

Проверено в github и должен выйти со следующим выпуском (1.33).Спасибо, что обратили на это мое внимание.Ваш парень из журнала, Майк.

2 голосов
/ 06 мая 2011

Похоже, что

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

вызов должен удалить все инициализированные до сих пор.Следует удалить все связанные ресурсы.

0 голосов
/ 02 декабря 2011

Из документов на http://search.cpan.org/dist/Log-Log4perl/lib/Log/Log4perl.pm:

Чтобы удалить регистратор из системы, используйте Log :: Log4perl-> remove_logger ($ logger).После того, как оставшаяся ссылка $ logger исчезнет, ​​регистратор самоуничтожится.Если рассматриваемый регистратор является скрытным регистратором, все его удобные ярлыки (DEBUG, INFO и т. Д.) Превратятся в no-ops.

...