log4j의 Logger.getLogger ()가 클래스 유형을 전달해야하는 이유는 무엇입니까?
log4j 사용 방법에 대한 기사를 읽었습니다. 대부분은 아래 코드를 시작으로 제공합니다.
Logger logger = Logger.getLogger("com.foo.Bar");
또는
Logger logger = Logger.getLogger(XXX.class);
이것은 로거 객체를 초기화하지만 내 질문은 왜 클래스 유형을 매개 변수로 보내야 하는가? 로거를 사용할 때 어떤 클래스를 사용하든 상관 없기 때문에 클래스 유형이 로거에 영향을 미치지 않는 것 같습니다. 로거를 정적이고 공개적으로 선언하면 다른 클래스에서이 로거를 호출 할 수 있습니다. 그러면 이렇게 설계하려는 작성자의 의도는 무엇입니까? 로거를 사용할 때 클래스 유형이 무언가를 바인딩합니까? 또는 모든 클래스 유형을 getLogger 함수로 보낼 수 있습니다.
클래스 유형 이외의 로거 이름으로 항상 모든 문자열을 사용할 수 있습니다. 확실히 괜찮습니다.
많은 사람들이 클래스 유형을 사용하는 이유는 다음과 같습니다.
사용하기 쉬운. 복잡한 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
'IT TIP' 카테고리의 다른 글
장고에서 부트 스트랩을 어떻게 사용할 수 있습니까? (0) | 2020.12.12 |
---|---|
텍스트 영역 높이 : 100 % (0) | 2020.12.12 |
GitHub API : 기여한 저장소 (0) | 2020.12.12 |
access_type = online 일 때“이 앱은 다음을 수행합니다. 오프라인 액세스 가능” (0) | 2020.12.12 |
번들 UITests가 손상되었거나 필요한 리소스가 누락되어로드 할 수 없습니다. (0) | 2020.12.12 |