IT TIP

log4j의 Logger.getLogger ()가 클래스 유형을 전달해야하는 이유는 무엇입니까?

itqueen 2020. 12. 12. 12:55
반응형

log4j의 Logger.getLogger ()가 클래스 유형을 전달해야하는 이유는 무엇입니까?


log4j 사용 방법에 대한 기사를 읽었습니다. 대부분은 아래 코드를 시작으로 제공합니다.

 Logger logger = Logger.getLogger("com.foo.Bar");

또는

 Logger logger = Logger.getLogger(XXX.class);

이것은 로거 객체를 초기화하지만 내 질문은 왜 클래스 유형을 매개 변수로 보내야 하는가? 로거를 사용할 때 어떤 클래스를 사용하든 상관 없기 때문에 클래스 유형이 로거에 영향을 미치지 않는 것 같습니다. 로거를 정적이고 공개적으로 선언하면 다른 클래스에서이 로거를 호출 할 수 있습니다. 그러면 이렇게 설계하려는 작성자의 의도는 무엇입니까? 로거를 사용할 때 클래스 유형이 무언가를 바인딩합니까? 또는 모든 클래스 유형을 getLogger 함수로 보낼 수 있습니다.


  1. 클래스 유형 이외의 로거 이름으로 항상 모든 문자열을 사용할 수 있습니다. 확실히 괜찮습니다.

  2. 많은 사람들이 클래스 유형을 사용하는 이유는 다음과 같습니다.

    • 사용하기 쉬운. 복잡한 Java EE 애플리케이션에서 로거 이름 중복에 대해 걱정할 필요가 없습니다. 다른 사람들도 귀하의 로거 이름을 사용하는 경우, 귀하의 클래스 출력뿐만 아니라 로그 파일도있을 수 있습니다.

    • 로거 이름이 로그 파일에 표시되므로 로깅 클래스를 쉽게 확인할 수 있습니다. 특정 클래스로 빠르게 이동할 수 있습니다.

    • 클래스를 배포 할 때 사람들은 클래스의 로깅을 특정 파일이나 다른 위치로 리디렉션하려고 할 수 있습니다. 이 경우 특별한 로거 이름을 사용하는 경우 소스 코드를 확인하거나 소스를 사용할 수없는 경우이를 수행 할 수 없습니다.


로부터 의 javadoc : Logger.getLogger(Class)대한 속기입니다 getLogger(clazz.getName()). log4j 및 기타 로깅 프레임 워크와 함께 사용되는 규칙은 클래스별로 정적 로거를 정의하는 것입니다. 예를 들면

public class SomeClass {
    private static final Logger LOG = Logger.getLogger(SomeClass.class);
    ...
}

이 규칙이 로깅 출력 구성에 적합하다는 것을 알았습니다. 꼭 필요한 것은 아니지만 유용한 방법입니다.


1 : 전에 log4j.properties에서 정의 할 때 "클래스 이름"또는 "문자열 이름"을 사용할 수 있습니다.

log4j.logger.anything=INFO,anything

따라서 로그를 다음과 같이 기록 할 수 있습니다.

 Logger logger = Logger.getLogger("anything");

2 : 일부 로그 이름을 정의하면 별도이므로 쉽게 확인할 수 있습니다.


XXX.class는 Logger의 이름을 지정하는 것입니다. 즉, 후속 로그 문에 플래그를 지정합니다. 특정 로그 문이 속한 / 원인 클래스에 대한 아이디어를 제공합니다.


클래스 이름이있는 로거는 필수가 아니며 자신의 메시지를 사용할 수 있습니다. 사용하는 것이 관례입니다.

Logger logger = Logger.getLogger(XXX.class) 

디버그에 유용합니다. 실행되는 코드 줄을 기록합니다.


특정 로깅 라이브러리에 따라 달라질 수 있지만 일반적으로 이름 이상입니다. 로거의 계층 구조를 나타냅니다. 로거를 구성 할 때 일반적으로 다음과 같이 로그 수준과 로거 이름을 모두 전달합니다.

<logger name="org.hibernate" level="ALL"/>

이 속성은 단순한 이름이 아니라 계층 구조를 의미합니다. 그리고 대신 다음과 같이 작성한다면 :

<logger name="org" level="ALL"/>

최대 절전 모드뿐만 아니라 조직 패키지에있는 모든 것이 영향을받습니다. 반면에 다음과 같이 작성하면 :

<logger name="org.hibernate.validator" level="ALL"/>

그것은 Hibernate의 나머지 부분이 아닌 Hibernate Validation 패키지에만 관련 될 것이다.

그건 그렇고, 모든 공장에 대해 구체적인 클래스를 지정하고 싶지 않다면 다음 과 같은 것을 사용할 수 있습니다 (Kotlin) :

val logger: Logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())

클래스 유형별로 로그를 추적 할 수 있습니다.

예 1 :

public class Bar {
    Logger logger = Logger.getLogger("com.foo.Bar");
    ...
    logger.debug("debug message");
}

로그 메시지 아래에서 볼 수 있습니다.

DEBUG: **com.foo.Bar** debug message

예 2 :

public class Foo {
    Logger logger = Logger.getLogger("com.foo.Foo");
    ...
    logger.debug("debug message");
}

로그 메시지 아래에서 볼 수 있습니다.

DEBUG: **com.foo.Foo** debug message

If you have a lot of java class and logger message, It's too difficult to find where log messages are from.

참고URL : https://stackoverflow.com/questions/14596690/why-log4js-logger-getlogger-need-pass-a-class-type

반응형