Java에서 로거를 선언하는 것이 가장 좋은 방법은 static final
무엇입니까?
private static final Logger S_LOGGER
답변
private
-다른 클래스가 귀하의 로거를 납치 할 수 없도록static
-클래스 당 하나의 로거 인스턴스 만 있으므로 로거를 직렬화하려는 시도를 피할 수 있습니다.final
-수업 기간 동안 로거를 변경할 필요가 없습니다.
또한 log
가능한 한 단순하면서도 설명적인 이름 을 선호합니다 .
편집 : 그러나이 규칙에는 흥미로운 예외가 있습니다.
protected final Logger log = LoggerFactory.getLogger(getClass());
반대로 :
private static final Logger log = LoggerFactory.getLogger(Foo.class);
전자를 사용하면 상속 계층 전체의 모든 클래스에서 동일한 로거 이름 (실제 클래스의 이름)을 사용할 수 있습니다. 따라서 Bar
확장 Foo
하면 Bar
로거에 모두 기록됩니다 . 더 직관적 인 사람들도 있습니다.
답변
이 블로그 게시물 : Java 정적 로거 제거를 확인하십시오 . 이것은 jcabi-log 와 함께 slf4j 를 사용하는 방법입니다 .
import com.jcabi.log.Logger;
class Foo {
void save(File f) {
Logger.info(this, "file %s saved successfully", f);
}
}
정적 잡음을 더 이상 사용하지 마십시오.
답변
static
즉, 클래스 인스턴스 당 하나의 로거가 아니라 클래스 당 하나의 로거 만 작성 합니다. 로거는 클래스에 따라 달라지기 때문에 일반적으로 원하는 것입니다.
final
logger
변수 의 값을 변경하지 않을 것임을 의미 합니다. 거의 항상 모든 로그 메시지를 (한 클래스에서) 동일한 로거로 던지기 때문입니다. 드문 경우이지만 클래스가 일부 메시지를 다른 로거에 보내려고 할 때도 widgetDetailLogger
정적 변수의 값을 즉시 변경하지 않고 다른 로거 변수 (예 :)를 작성하는 것이 훨씬 더 명확합니다 .
답변
필드 값을 언제 변경 하시겠습니까?
당신이 결코 필드의 마지막을, 값을 변경 않을 경우 것은 만드는 명백한 값을 변경하지 않을거야.
답변
일반적으로 클래스 이름을 사용하여 기록하도록 로거를 초기화합니다. 즉, 정적이 아닌 경우 클래스의 인스턴스가 많은 각 인스턴스 (메모리 공간 부족)가 발생하지만이 로거는 모두 동일한 구성을 공유하고 정확히 동일하게 작동합니다. 그것이 static
비트 뒤에있는 이유 입니다. 또한 각각 Logger
클래스 이름으로 초기화 되므로 하위 클래스와의 충돌을 막기 위해 private
상속 할 수 없도록 선언합니다 . 은 final
당신이 일반적으로 변경하지 않는 것이 포인트에서 유래 Logger
하여 (이 경우는 아무도 그것을 변경할 수 있도록하는 것을 최종 확인하는 것이 합리적이다 – 그래서 한 번 당신이 “다시는 구성하지”결코하여 초기화 – 실행 중 실수 또는 그렇지 않으면). 물론 당신이 사용하려는 경우Logger
다른 방법 으로 사용 하지 않아도 될 수도 static final
있지만 앱의 80 %가 위에서 설명한대로 로깅을 사용한다고 생각합니다.
답변
이 질문에 대답하려면 “정적”과 “최종”이 무엇인지 스스로에게 물어야합니다.
Logger의 경우 (Log4J Logger 클래스에 대해 이야기한다고 가정) 클래스별로 범주를 원합니다. 이것은 한 번만 할당하고 클래스 당 하나 이상의 인스턴스가 필요하지 않다는 사실로 이어질 것입니다. 아마도 한 클래스의 Logger 객체를 다른 클래스에 노출시킬 이유가 없기 때문에 비공개로 만들고 일부 OO 원칙을 따르지 않는 이유는 무엇입니까?
또한 컴파일러는 그 이점을 활용할 수 있습니다. 따라서 코드가 약간 더 잘 수행됩니다. 🙂
답변
이는 일반적으로 객체의 모든 인스턴스에서 공유 할 수있는 기능의 종류이기 때문입니다. 같은 클래스의 두 인스턴스에 대해 서로 다른 로거를 갖는 것은 의미가 없습니다 (90 %의 시간).
그러나 때때로 로거 클래스가 싱글 톤으로 선언되거나 단순히 정적 함수를 제공하여 물건을 기록하는 것을 볼 수도 있습니다.