2011-05-06 4 views
4

특정 DBI 연결이 수행하는 작업을 캡처하기 위해 Log4perl을 패키지의 일부로 사용하고 있습니다. 현재 나의 계획은 Log::Log4perl->get_logger($mysql_connect_id)을 통해 각 연결마다 새로운 로거 개체를 만드는 것입니다. 다양한 로깅을 사용하면 서로 다른 파일이나 같은 파일에 서로 연결하지 않고도 쓸 수 있습니다.Log4perl logger가 더 이상 필요하지 않을 때 처분

연결이 끊어지고 로거가 더 이상 필요하지 않을 때 무슨 일이 일어날 지 궁금합니다. Log4perl이 이러한 로거를 무기한으로 유지하는 경우 메모리 누수가 발생합니다.

더 이상 유용하지 않다고 생각되면 로거를 제거하는 가장 좋은 방법은 무엇입니까? 반대로 Log4perl에 이미 이런 종류의 누출을 막아주는 일종의 내장 처리 메커니즘이 있습니까?


편집 : Log : Log4perl :: Logger는 유망한 것으로 보이는 DESTROY 방법이 있습니다. 그러나 그것은 문서화되어 있지 않으며 "문자열 이퀄라이저에서 초기화되지 않은 값 사용"경고를 던져서 조심스럽게 만듭니다. 그것은 해킹처럼 느껴집니다. (즉, 그것을 할 수있는 최선의/유일한 방법 인 경우에, 나는 문제가 될 생각 "나는 특정 패키지에서 나오는 특정 경고를 해제하려면 어떻게합니까?")

+1

[삭제] (http://perldoc.perl.org/perlobj.html#Destructors) 메소드는 수동으로 호출하면 안됩니다. 객체가 제거 될 때 perl이 호출자가 될 것이기 때문입니다 기억으로부터. 'DESTROY'를 직접 호출해도 메모리는 해제되지 않습니다. –

+0

@ 이반 : 글쎄, 쓰레기. 완벽하게 잘 생긴 해킹을하기에 너무. 팁 고마워. – BlairHippo

+1

로거 객체는 코드 참조의 작은 해시입니다.당신이 많은 것을 만들지 않는다면, 여분의 메모리는 프로그램에서 메모리에 저장하는 실제 데이터와 비교할 때 중요하지 않습니다. 그것에 대해 걱정하지 마십시오. – Schwern

답변

5

유일한 방법은 Log::Log4perl::Logger의 내부 캐시를 조작하는 것입니다.

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

이 그것을 로그 :: Log4perl의 현재 버전에서 작동 할 수있는 "안전"하지만 업데이트에 침입 수에 안전하지 않습니다. 이전에 다른 SO 사용자가 제안했지만 삭제했습니다.

API의 일부로 개별 캐시 항목을 삭제하는 기능은 make a feature request입니다. 신속하게 처리하려면 패치를 제출하십시오. 꽤 간단합니다.

+0

문제를 해결하여 처리했지만 문제가 해결되지 않은 경우 원래의 디자인, 이것이 내가 사용하고자하는 해결책이다. 그리고 내 주머니에 넣는 것도 좋은 일입니다. 감사! (BTW - 나는 RL에서 서로를 안다고 생각한다.) – BlairHippo

2

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

처럼 보인다 호출은 지금까지 초기화 된 모든 것을 제거해야합니다. 관련 자원을 제거해야합니다.

+0

핵무기가 궤도에서? :-) 그게 좋겠지 만, 내가 올바르게 읽는다면, 나는 주변에 보관하고 싶은 로거도 없앨 것이다. – BlairHippo

+0

@BlairHippo - 질문을 잘못 읽었습니다. Log : Log4perl을 완전히 없애고 싶다고 생각했습니다. 그냥 무언가를 제거하고 싶다면 새로운 설정을주고 재 초기화 할 필요가없는 이유는 무엇입니까? – bvr

+0

'cleanup()은 자체 캐시를 삭제하는 것이 아니라 각 로거에서 DESTROY를 적극적으로 호출한다는 것은 불행한 일입니다. 이것은 불필요하며'cleanup()'호출을 위험하게 만듭니다. 제 3 자 모듈에서도 모든 프로세스의 모든 로거가 더 이상 사용되지 않는다는 것을 알아야합니다. – Schwern

3

지연으로 인해 죄송합니다. 지금은 최종적으로 수정 한 것 같습니다. 이제 새로 구현 된 Log::Log4perl->remove_logger($logger) 메서드를 사용하여 사용하지 않는 로거를 삭제할 수 있습니다. 보유하고있는 r의 나머지 참조를 누락하는 것을 잊지 마십시오.

Checked into github 다음 릴리스 (1.33)와 함께 출시되어야합니다. 이 점에 대해 관심을 가져 주셔서 감사합니다. 네 log4perl 녀석, 마이크. http://search.cpan.org/dist/Log-Log4perl/lib/Log/Log4perl.pm에서 워드 프로세서

0

:

시스템에서 로거를 제거하려면, 로그 :: Log4perl-> remove_logger ($ 로거)를 사용합니다. 나머지 참조 $ 로거가 사라지면 로거가 자동 소멸됩니다. 문제의 로거가 스텔스 로거라면, 모든 편의 단축키 (DEBUG, INFO 등)가 no-ops로 바뀝니다.

+0

Heh. 다른 답변을 읽으면 해당 기능이이 질문의 결과입니다. 나는 사실 자랑 스럽다. :-) – BlairHippo

관련 문제