2009-09-27 4 views
0

우리는 한 번 '정적'클래스에서 하나의 정적 로거 참조를 갖는 패키지와 전화 로거Log4j가 메모리를로드합니까?

2)의 각 클래스의 정적 로거 참조를 갖는 두 가지 방법

1)에서의 log4j를 호출하고이 '정적을 참조 할 수 있습니다 '수업은 모든 곳에서

어떤 방법이 효율적이고 어떤 방법이 일반적으로 좋은 기억을 바탕으로합니까?

+0

각 문제마다 여러 가지 해결책이있을 수 있습니다. 그러나 우리는 그 중 가장 좋은 솔루션을 선택해야합니다. Stackoverflow에 내 질문의 경우 나는 높은 투표와 솔루션을 선호해야합니까? – Niger

답변

0

Log4j에 사용되는 LoggerRepository가 다른 로거를 유지해야하기 때문에 다중 로거를 만드는 데 더 많은 메모리가 필요합니다. 그러나이 양의 메모리는 중요하지 않아야하며 각 클래스마다 다른 로거를 사용하면 로그 구문의 출처를 쉽게 추적 할 수 있습니다. 여러 패키지/클래스에 대해 서로 다른 로그 수준을 설정할 수도 있습니다. 모든 수업에서 하나의 로거를 사용하는 것은 권장하지 않습니다.

2

첫 번째 방법은 클래스 단위로 로깅을 제어 (예 : 수준 설정)하는 기능을 제공합니다. 이것은 많은 Logger 인스턴스를 사용하는 대신에 발생합니다.

두 번째 방법은 하나의 Logger 인스턴스를 제공하지만 전체 응용 프로그램에 대해 로깅을 제어 할 수 있습니다.

AFAIK는 장시간 실행되는 응용 프로그램에서 많은 정적 (정적) 로거 인스턴스를 갖는 유일한 지속적인 비용은 메모리 사용의 작은 델타입니다. 따라서 이것은 약간의 메모리 사용 증가와 응용 프로그램 로깅의 유연성/구성 가능성 간의 균형입니다.

각 클래스마다 로거를 만들지는 않겠지 만 전체 응용 프로그램에서 하나의 로거 만 사용했다면 사용자 (또는 사용자/클라이언트)가 후회할 수 있다고 생각합니다.

0

물론 2 번 방법이 메모리 효율이 높습니다. 그러나 일반적으로 이렇게하는 것이 바람직하지 않습니다. log4j를 매우 유용하게 만드는 클래스/패키지 로그 필터링 기능을 놓치게됩니다. 정말로 빡빡한 메모리 예산 방법이 아니라면 # 1 방법이 정말 좋습니다.

더 많은 메모리를 필요로하는 log4j를 호출하는 세 번째 방법은 각 클래스에 비 정적 멤버를 사용하는 것입니다. 다음과 같은 것을 사용할 수 있습니다 : protected Logger log = Logger.getLogger(getClass()); getClass()는 항상 실제 인스턴스 클래스를 참조하기 때문에 클래스가 서브 클래 싱 될 경우이 방법이 바람직합니다.

0

Log4j는 특정 상황에서 PermGen 공간을 먹는 것으로 알려진 문제가 있지만 일반적으로 한 응용 프로그램 인스턴스가 시간이 지남에 따라 OutOfMemoryError 예외가 발생할 수 있음을 알고 있습니다.

대부분의 경우 응용 프로그램이 Java EE 응용 프로그램 서버에 배포되는 경우 각 배포시 마지막 배포의 정적 로거가 ClassLoader에 저장됩니다. 이것은 응용 프로그램 서버를 다시 시작하지 않고 응용 프로그램을 여러 번 다시 배포 할 때만 문제가됩니다 (주로 개발하는 동안 하루 종일 응용 프로그램을 다시 배포 할 때 발생합니다).

대개 문제는 아니지만 문제는 아닐 수 있습니다. "log4j permgen"과 같은 것을 검색하면 더 많은 정보를 얻을 수 있습니다.

관련 문제