로거가 프라이빗 스태틱이어야 하는지 여부
로거를 정적으로 선언해야 합니까, 말아야 합니까?일반적으로 로거에 대해 다음 두 가지 유형의 선언을 볼 수 있습니다.
보호된 로그 로그 = 새 로그4JLogger(aClass.class);
또는
개인 정적 로그 로그 = 새 로그4JLogger(aClass.class);
어떤 것을 사용해야 할까요?양쪽의 장단점은 무엇입니까?
non-static 형식의 장점은 다음과 같은 (추상) 기본 클래스에서 올바른 클래스 이름이 사용되는 것을 걱정하지 않고 선언할 수 있다는 것입니다.
protected Log log = new Log4JLogger(getClass());
단, 단점은 클래스의 모든 인스턴스에 대해 완전히 새로운 로거 인스턴스가 생성된다는 것입니다.그 자체는 비싸지 않을 수 있지만 상당한 오버헤드가 발생합니다. 하는 것 같습니다.static
대신 폼을 만듭니다., 이 클래스에서 하고 로거 시 입니다.왜냐하면 이 이름은 모든 에서 사용할 수 있기 때문입니다.getClass()
정적 컨텍스트에서는 사용할 수 없습니다.IDE를 사용합니다.예:logger
+ctrl+space
.
한편, 공장에서 로거를 취득하면, 공장에서 로거를 취득해, 그 후에 이미 인스턴스 되고 있는 로거를 캐시 할 가능성이 있는 경우, 비정적 형식을 사용하면 오버헤드가 그다지 증가하지 않습니다.예를 들어 Log4j에는 이 목적을 위한 가 있습니다.
protected Log log = LogManager.getLogger(getClass());
예전에는 모든 로거가 정적인 상태여야 한다고 생각했습니다만, wiki.apache.org의 이 기사에서는 클래스 로더의 누전에 관한 중요한 메모리 문제가 몇 가지 언급되고 있습니다.로거를 스태틱으로 선언하면 선언 클래스(및 관련 클래스 로더)가 공유 클래스 로더를 사용하는 J2EE 컨테이너에서 가비지가 수집되는 것을 방지할 수 있습니다.이로 인해 어플리케이션을 충분히 재배포하면 PermGen 오류가 발생합니다.
이 클래스로더 누출 문제를 해결할 방법은 로거를 비정적으로 선언하는 것 외에 없습니다.
가장 중요한 차이는 로그 파일에 미치는 영향입니다.로그는 어떤 카테고리에 있습니까?
- 첫 번째 선택에서는 서브클래스의 로그가 슈퍼클래스의 카테고리에 포함됩니다.그것은 매우 직관에 어긋나는 것 같다.
첫 번째 케이스에는 다음과 같은 종류가 있습니다.
보호된 로그 로그 = 새 로그4JLogger(getClass());
이 경우 로그 카테고리에 기록된 코드가 어떤 개체에서 작동했는지 알 수 있습니다.
두 번째 선택 항목(프라이빗 스태틱)에서 로그 카테고리는 로깅 코드를 포함하는 클래스입니다.따라서 보통 로그에 기록되는 작업을 수행하는 클래스입니다.
저는 그 마지막 옵션을 강력히 추천합니다.다른 솔루션과 비교하여 다음과 같은 이점이 있습니다.
- 로그와 코드 사이에는 직접적인 관계가 있습니다.로그 메시지가 어디서 왔는지 쉽게 찾을 수 있습니다.
- (카테고리별로 실행됨) 로깅 수준을 조정해야 하는 경우 일반적으로 특정 클래스에 의해 작성된 특정 메시지에 관심이 있거나 관심이 없기 때문입니다.카테고리가 메시지를 쓰는 클래스가 아닌 경우 수준을 조정하기가 더 어렵습니다.
- 정적 메서드에 로그인할 수 있습니다.
- 로거는 클래스별로 1회만 초기화(또는 조회)하면 됩니다.따라서 작성된 인스턴스별로 초기화(또는 조회)하는 것이 아니라 기동 시에 필요합니다.
단점도 있습니다.
- 메시지를 기록하는 모든 클래스에서 선언해야 합니다(슈퍼클래스 로거 재사용 없음).
- 로거를 초기화할 때 올바른 클래스 이름을 입력하도록 주의해야 합니다(그러나 IDE가 잘 처리됩니다).
컨트롤의 반전을 사용하여 로거를 생성자로 전달합니다.클래스 내에서 로거를 작성하면 유닛 테스트에 큰 어려움을 겪게 됩니다.너 유닛 테스트 쓰고 있지?
언급URL : https://stackoverflow.com/questions/3842823/should-logger-be-private-static-or-not
'programing' 카테고리의 다른 글
v-select 옵션의 특성을 설정하는 방법 (0) | 2022.10.01 |
---|---|
MySQL/MariaDB는 COUNT(*)를 방정식에 포함시킵니다. (0) | 2022.10.01 |
JavaScript에서 함수 호출에 명명된 파라미터를 제공하는 방법이 있습니까? (0) | 2022.10.01 |
moment.js가 포함된 최신 문자열 구문 분석 (0) | 2022.10.01 |
파일 확장자를 PHP로 가져오려면 어떻게 해야 하나요? (0) | 2022.10.01 |